前段时间d哥让我帮忙搞个特征码扫描的接口。然后就看了下ac自动机,进而免不了KMP了。以前搞过,后又忘了,现在用自己理解,自己写出来。这样可能记忆会更深。
-----------------------------------------------------------华丽的分割线-----------------------------------------------------------------------
KMP用来解决单字符串匹配问题。
暴力的方法:
假设源串是S,模式串为P
i=0,j=0;
ans=0;while(i<pLen&&j<sLen){
if(s[j]==p[i]){
i++,j++;
}
else{
i=0;
j=j-i+1;
}
if(i==pLen)
ans++;
}
不用说,小学生都写得出来,O(n*m)
每次比较的时候,当到达某个位置失配时,暴力的方式是重头来。KMP的做法是,将模式串调整至合适位置,在源串失配的位置接着进行比较。(模式串与源串比较过后,可以根据模式串的最长前后缀,产生一个next数组)