前几天去面试 在数据算法上 吃了很大亏,工作了近两年,发现数据结构的知识忘的差不多了,看来得多花点时间学习学习。 #include <iostream> #include "string.h" using namespace std; int count_KMP; int count_index; int count_next; void get_nextval(char T[],int next[]) { int i=0; //nextval[1]=0; int intT=strlen(T); next[0]=-1; int j=-1; while(i<intT) { ++count_next; ++count_KMP; if(j==-1 || T[i]==T[j]) { ++i; ++j; if(T[i]!=T[j]) next[i]=j; //修正的next函数算法 else next[i]=next[j]; //修正的next函数算法 //next[i]=j; //未修正的next函数算法 } else j=next[j]; } } int Index_KMP(char S[],char T[],int pos,int next[]) { int lenS=strlen(S); int lenT=strlen(T); int i=pos; int j=0; while(i<lenS && j<lenT) { ++count_KMP; if(j==-1 || S[i]==T[j]) { ++i; ++j; } else j=next[j]; } if(j>=lenT) return i-lenT+1; else return -1; }//KMP算法实现 int intdex(char S[],char T[],int pos) { int i=pos; int j=0; int lenT=strlen(T); int lenS=strlen(S); while(i<=lenS-1 && j<=lenT-1) { ++count_index; if(S[i]==T[j]) { ++i; ++j; } else { i=i-j+1; j=0; } } if(j>=lenT) return i-lenT+1; else return -1; }//索引匹配算法实现 void main() { int next1[20]; int matchPosition=-1; char masterSring[]="00000000000000000000000000000000000000000000000000000000000000000000000000000001";//"acabaabaabcacaabc"; char patternSring[]="000000001";//"bcacaa"; get_nextval(patternSring,next1); matchPosition=Index_KMP(masterSring,patternSring,0,next1); cout<<"KMP最终匹配位置为:"<<matchPosition<<endl; cout<<"KMP匹配的次数为:"<<count_KMP<<endl; matchPosition=intdex(masterSring,patternSring,0); cout<<"一般的模式匹配最终匹配位置为:"<<matchPosition<<endl; cout<<"一般的模式匹配的次数为:"<<count_index<<endl; } 请各位多多指教,我是在学习中,有不足的一定要指出来哦。