http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html
/*#include<iostream> #include <string> using namespace std; int count_same_char(string T,int j); void get_next(string T,int *next) { int j=1; next[1]=0; for(int k=2;k<=T.size();++k) { next[k]=count_same_char(T,k)+1; } } //返回字符串T中0到j-1个字符串,有多少个前后缀是相等的 //若没有返回0 int count_same_char(string T,int j) { j=j-1; int cout_number=0; int director=0; for(int i=(j/2);i>=1;i--)//假设前后缀相等的字符个数 { for(int k=0;k<i;k++) { if(T[k]!=T[j-i+k]) {director=0;break;} director=1; } if(director==1) {cout_number=i;break;} } return cout_number; } int main() { string T="ababaaaba"; int next[10]; get_next(T,next); for(int i=1;i<=T.size();++i) { cout<<next[i]<<‘ ‘; } cout<<endl; /*string T="abcabx"; cout<<count_same_char(T,6)<<endl; */ /* system("pause"); return 1; }*/ #include<iostream> #include <string> using namespace std; int get_number(string T,int j); void get_char_number(string T,int *next) { next[0]=0; int K=T.size(); for(int i=1;i<K;i++) { next[i]=get_number(T,i); } } int get_number(string T,int j) { int count_number=0; int i,k,temp; for(k=(j+1)/2;k>=1;k--) { temp=0; for(i=0;i<k;i++) { if(T[i]!=T[j-k+i+1]) {temp=1;break;} } if(temp==0) {count_number=k;break;} } return count_number; } int KMP(string S,string T) { int next[100]; int result[100]; get_char_number(T,next); if(T.size()>S.size()) return -1; int i=0;//在S中的起始搜索位置 while(i<=(S.size()-T.size())) { int j,temp=1; for(j=0;j<T.size();j++) { if(T[j]!=S[i+j]) {temp=0;break;} } if(temp=1) return i; if(j==0) i++; i=i+j-next[j-1]; } return -1; } int main() { /* string T="jkl"; //cout<<get_number(T,4)<<endl; int next[10]; get_char_number(T,next); for(int i=0;i<T.size();i++) cout<<next[i]<<‘ ‘; cout<<endl; */ string S="fghjkl"; string T="jkl"; cout<<KMP(S,T)<<endl; system("pause"); return 1; }
时间: 2024-12-17 20:39:13