KMP手算失效函数/next数据方法(个人感觉最快方法)
2026/9/20 10:22:15 网站建设 项目流程

话不多说,直接举例子展示:

1 模式串T:abaabc,求其失效函数

①首字符的f[ ]=-1,第二个字符的f[ ]=0(铁律)

第一步结果
下标012345
字符abaabc
f[ ]/next-10

②求T[2]的失效函数值,看其前一个字符b,f[1]=0,下标为0的字符是a,a和b不相等无法往前走了,则用f[0](失效函数值)+1,即0作为T[2]的失效函数值。

第二步结果
下标012345
字符abaabc
f[ ]/next-100

③求T[3]的的失效函数值,看其前一个字符a,f[2]=0,下标为0的字符是a,a和a相等,用0(下标值)+1,即1作为T[3]的失效函数值。

第三步结果
下标012345
字符abaabc
f[ ]/next-1001

④求T[4]的失效函数值,看其前一个字符a,f[3]=1,下标为1的字符是b,b和a不相等继续往前走,f[1]=0,下标为0的字符是a,a和a相等,用0(下标值)+1,即1作为T[4]的失效函数值。

第四步结果
下标012345
字符abaabc
f[ ]/next-10011

⑤求T[5]的失效函数值,看其前一个字符b,f[4]=1,下标为1的字符是b,b和b相等,用1(下标值)+1,即2作为T[5]的失效函数值。

下标012345
字符abaabc
f[ ]/next-100112

方法总结

①计算字符A的失效函数值,看其前面一个字符B,将B和下标为 B的失效函数值 的字符C作比较;

②如果B和C相等,则将C的下标+1作为A的失效函数值;

③若B和C不相等,继续向前,将B和下标为 C的失效函数值 的字符D作比较;

④若相等,则将D的下标+1作为A的失效函数值;(同②)

⑤若不相等继续向前,其实是在重复②-④步

⑥直至找到首字符Z仍然不相等,则将 Z的下标+1作为A的失效函数值(也就是-1+1=0)。

2 模式串:abcaabbabcabaacbacba,求其失效函数(附上答案,可以自查)

┏━━━━━━━━━┓
┃ 答 案 ┃
┗━━━━━━━━━┛
┏━━━━━━━━━┓
┃ 在 下 方
┗━━━━━━━━━┛

┏━━━━━━━━━┓
┃ 答 案 ┃
┗━━━━━━━━━┛
┏━━━━━━━━━┓
┃ 在 下 方
┗━━━━━━━━━┛

┏━━━━━━━━━┓
┃ 答 案 ┃
┗━━━━━━━━━┛
┏━━━━━━━━━┓
┃ 在 下 方
┗━━━━━━━━━┛

┏━━━━━━━━━┓
┃ 答 案 ┃
┗━━━━━━━━━┛
┏━━━━━━━━━┓
┃ 在 下 方
┗━━━━━━━━━┛

下标012345678910111213141516171819

字符

abcaabbabcabaacbacba
f[]-10001120123421100100

存档-KMP算法代码实现

haystack-匹配串,needle-模式串

class Solution { public: int strStr(string haystack, string needle) { //KMP算法 //先构造匹配串的next数组 if(needle.size()==0) return 0; vector<int> next(needle.size()); next[0]=0; for(int i=1,j=0;i<needle.size();i++){ while(j>0 &&needle[i]!=needle[j]){ j=next[j-1]; } if(needle[i]==needle[j]){ j++; } next[i]=j; } //匹配过程 for(int i=0,j=0;i<haystack.size();i++){ while(j>0 && haystack[i]!=needle[j]){ j=next[j-1]; } if(haystack[i]==needle[j]){ j++; } if(j==needle.size()){ return i-needle.size()+1; } } return -1; } };

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询