KMP算法
在看string的find函数时,本来想看看find的效率如何,突然发现kmp算法有点忘了,做个笔记。
看了几个blog感觉不是很有感觉(主要是标号和我学的不一样,不习惯),看了严蔚敏的视频,把感觉找回来了。
next[j]的值就是j之前字符串与最开始字符串的最长匹配字符串的长度+1。
找了严蔚敏的几个测试实例测了一下,发现全对,说明我对next函数了解了。
随便贴个代码:
//next[0] 初始化为-1 next[1]初始化为0 //next[j]的值就是j之前字符串与最开始字符串的最长匹配字符串的长度。 //也就是说比严蔚敏示例的next值都小1,比较符合字符串从0开始的习惯。 #include<iostream> using namespace std; void getnext(char s2[],int next[]) { memset(next,0,sizeof(next)); int i=-1,j=0; next[0]=-1; while(j<strlen(s2)) { if(i==-1||s2[i]==s2[j]) { i++; j++; next[j]=i; } else i=next[i]; } } int KMP(char s1[],char s2[],int next[]) { int i=0,j=0,len1=strlen(s1),len2=strlen(s2); while((i<len1)&&(j<len2)) { if(j==-1||s1[i]==s2[j]) { i++; j++; } else j=next[j]; } if(j==len2) return i-len2; else return -1; } void main() { char s1[200] = "aaaabbbbaabaaabaaaabbbbb",s2[200] = "aabaaabaaaab"; //-1 0 1 0 1 2 2 3 4 5 6 2 int next[200]; getnext(s2,next); for (int i = 0; i<12; i++) { cout<<next[i]<<" "; } cout<<endl; cout<<KMP(s1,s2,next)<<endl; system("pause"); }