这里写代码片
KMP:
#include<cstdio>
#include<cstring>
#include<iostream>
#include <vector>
using namespace std;
#define N 100
int nxt[N];
int CreateNext(int start,int len,string &srcstr,string &matchstr){
memset(nxt,0,sizeof(nxt));
for(int i=start;i<start+len;++i){
matchstr+=srcstr[i]; //取出匹配样本的某一子串
}
cout<<"matchstr: "<<matchstr<<endl;
nxt[0]=0;
//int q,k;
for (int q = 1,k = 0; q < matchstr.length(); ++q)
{
while(k > 0 && matchstr[q] != matchstr[k])
k = nxt[k-1];
if (matchstr[q] == matchstr[k])
k++;
nxt[q] = k;
}
for(int i=0;i<matchstr.length();i++)
cout<<nxt[i];
cout<<endl;
return 0;
}
inline int KMP(string &str,string &matchstr){
//int i=0,q=0;
for(int i=0,q=0;i<str.length();++i){
while(q>0 && str[i] != matchstr[q]){
q=nxt[q-1];
}
if(str[i] == matchstr[q]){
++q;
}
if(q==matchstr.length()){
printf("Pattern occurs with shift:%d\n",(i-matchstr.length()+1));
return 1;
}
}
return 0;
}
bool Check(vector<string> &vec,string &matchstr){
for(int i=0;i<vec.size();i++){
if(!KMP(vec[i],matchstr)) return false;
}
return true;
}
int main(){
int n;
cout<<"输入字符串个数: ";
cin>>n;
int minlen=-1;
int minpos;
string str,shortest_str="";
vector<string> vec;
for(int i=0;i<n;i++) {
cin>>str;
if(minlen==-1 || minlen>str.length()){
if(shortest_str!="")
vec.push_back(shortest_str);
shortest_str=str;
minlen=str.length();
}else{
vec.push_back(str);
}
}
bool flag=0;
string allmatchstr="";
for(int i=minlen;i>0;--i){ //i表示所需匹配的字符串的长度
for(int j=0;j<=minlen-i;++j){ //j表示所需匹配字符串的起始位置,从最长len开始找
cout<<"start:"<<j<<" to:"<<j+i<<" len:"<<i<<endl;
string matchstr="";
CreateNext(j,i,shortest_str,matchstr);
if(Check(vec,matchstr)) {
cout<<"find: "<<matchstr<<endl;
if(!flag){
flag=1;
allmatchstr+=matchstr;
}
else
allmatchstr+=+","+matchstr;
continue;
//return 0;
}
}
if(flag) break;
}
cout<<"All match longest substring:"<<endl;
cout<<allmatchstr<<endl;
return 0;
}