/*字符串匹配*/ #include<iostream> using namespace std; void get_next(string T,int *next) {//朴素算法 int i,j; i=1; j=0; next[1]=0; while(i<T.length()) { if(j==0 || T[i]==T[j]) { i++; j++; next[i]=j; } else j=next[j]; } } void get_next_new(string T,int *next) {//改进算法 int i,j; i=1; j=0; next[1]=0; while(i<T.length()) { if(j==0 || T[i]==T[j]) { i++; j++; if(T[i]!=T[j]) next[i]=j; else next[i]=next[j]; } else j=next[j]; } } int Index_KMP(string S,string T,int pos) { int i=pos; int j=1; int next[255]; get_next(T,next); while(i<=S.length() && j<=T.length()) { if(j==0 || S[i]==S[j]) { i++; j++; } else j=next[j]; } if(j>T.length()) return i-T.length(); else return 0; } int main() { string S="abcdefgab"; string T="abcdex"; cout<<Index_KMP(S,T,1); return 0; }