首页 > 代码库 > 字符串的KMP算法替换

字符串的KMP算法替换

  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 }