CHAPTER_12 提高篇(6)——字符串专题
12.2.3 KMP算法
在理解了next数组的求解过程的基础上,正式进入KMP算法的讲解。
《算法笔记》对整个KMP匹配进行了详细地阐述:
可以总结出KMP算法的思路:
(1)初始化j=-1,表示patten当前已匹配的最后一位。
(2)让 i 遍历文本串text,对于每个 i ,执行(3)(4)。
(3)不断令j=next[j],直到 j 退回-1,或是text[i]==pattern[j+1]。
(4)如果text[i]==pattern[j+1],则j++。如果 j 达到m-1,说明模式串匹配完成。
//判断pattern是否是text的子串
bool KMP(char text[],char pattern[]) {
int n=strlen(text), m=strlen(pattern); //字符串长度
getNext(pattern,m); //计算模式串next数组
int j=-1;
for(int i=0;i<n;i++) {
while(j!=-1&&text[i]!=pattern[i+1]) {
j=next[j];
}
if(text[i]==pattern[j+1]) {
j++;
}
if(j==m-1) {
return true;
}
}
return false;
}
至此,KMP基本算法已经介绍完毕。但是实际上,我们还可以在这个基础上进行优化,优化后的算法将不再出现next数组,而出现nextval数组,也就是KMP算法常见的另一种版本—nextval数组版本。这里不在过多阐述此算法,因为基本KMP算法已经足够使用。
扫描二维码关注公众号,回复:
13291274 查看本文章
