/* vc6.0实现 KMP算法主要是为了求解最大匹配的字符串及其长度 主要思想就是将已经匹配的字符串进行模式匹配。 这样比单个的比较的次数少一些。 author:macower */ #include <iostream> #include <string> using namespace std; int max = 0; int loc = 0; void KMP(string a ,string b); int main() { string a; string b; while(cin>>a>>b) { KMP(a,b); } return 0; } void KMP(string a ,string b) { int lena = a.length(); int lenb = b.length(); int len = 1; string tmpb; string tmpa; int max = 0; int loc = 0; for(int ij= 0;ij<=b.length()-max;ij++ )//判断最大长度 如果长度比max小就直接减枝 { len = 1; //字符长度比较初始化为1 lenb = lenb-ij; // 需要比较b字串的长度 for(int ii = 0;ii<=lena-len;ii++) { if((len-1)>lenb) break; //如果查找的长度已经达剩余的总的长度则跳出循环 tmpb = b.substr(ij,len);//已经匹配的字符串 tmpa = a.substr(ii,len); cout<<"tmpa = "<<tmpa<<"tmpb = "<<tmpb<<endl; if(tmpa.compare(tmpb) == 0) { len++; if((max <(len-1))) //记录最大匹配长度max及其位置loc { max = len-1; loc = ij; } ii--; // 确保指针不动与(int ii = 0;ii<=lena-len;ii++)的ii++相互抵消一保证从匹配继续向后移动 } } } cout<<"max= "<<max <<endl; }