字符串的KMP算法替换
时间:2014-04-27 20:45:57
收藏:0
阅读:591
1 #include<iostream> 2 #include<string> 3 using namespace std; 4 5 6 7 class myString 8 { 9 private: 10 string mainstr; 11 int size; 12 void GetNext(string p,int next[]); 13 int KMPFind(string p,int next[]); 14 public: 15 myString(); 16 //~myString(); 17 void SetVal(string sp); 18 int KMPFindSubstr(string p); 19 }; 20 myString::myString() 21 { 22 size=0; 23 mainstr=" "; 24 } 25 /*myString::~myString () 26 { 27 size=0; 28 mainstr=" "; 29 }*/ 30 int myString::KMPFindSubstr(string p) 31 { 32 int m,next[20]; 33 GetNext(p,next); 34 m=KMPFind(p,next); 35 return m; 36 37 38 } 39 40 41 43 int myString::KMPFind(string p,int next[]) 44 { 45 int i=0,j=0,len=p.length (); 46 while(i<size&&j<len) 47 { 48 if(j==-1||mainstr[i]==p[j]) 49 { 50 ++i; 51 ++j; 52 } 53 else 54 j=next[j]; 55 } 56 if(j>=len) 57 58 return i-len+1; 59 else 60 return 0; 61 } 62 63 64 65 void myString::SetVal(string sp) 66 { 67 mainstr=" "; 68 mainstr.assign(sp); 69 size=mainstr.length (); 70 } 71 void myString::GetNext(string p,int next[] ) 72 { 73 int i=0,j=-1; 74 next[0]=-1; 75 while(i<p.length ()) 76 { 77 if(j==-1||p[i]==p[j]) 78 { 79 ++i; 80 ++j; 81 next[i]=j; 82 } 83 else 84 j=next[j]; 85 } 86 } 87 88 89 int main() 90 { 91 int t,m,i,j,len1,len2,len3,temp1,temp2,t2; 92 char c[20]="\0"; 93 string s1,s2,s3; 94 myString a; 95 cin>>t; 96 while(t--) 97 { 98 cin>>s1; 99 cin>>s2; 100 cin>>s3; 101 len1=s1.length (); 102 len2=s2.length (); 103 len3=s3.length (); 104 a.SetVal (s1); 105 m=a.KMPFindSubstr(s2);// 得到匹配开始的位置 106 cout<<s1<<endl; 107 temp1=len3-len2; // 替换串长度 跟 模式串长度 的比较, 108 // 用于后面计算输出的总长度 109 temp2=m+len2; // 紧跟模式串后第一个字符的位置 110 t2=temp2-1; // 用于后面的复制字符起点 111 112 113 114 if(m>0){ // 如果模式串匹配成功 115 for(i=0;i<m-1;i++) // 匹配串之前的字符复制到数组中 116 c[i]=s1[i]; 117 for(j=0;j<len3;j++,i++) // 替换串中的字符复制到数组中 118 c[i]=s3[j]; 119 for(i;i<len1+temp1;i++,t2++) // 模式串后的 字符复制到数组中 120 c[i]=s1[t2]; 121 for(i=0;c[i]!=‘\0‘;i++) // 输出整个数组 122 cout<<c[i]; 123 cout<<endl; 124 125 } 126 else if(m==0) 127 cout<<s1<<endl; 128 129 } 130 return 0; 131 }
评论(0)