首页 > 其他 > 详细

KMP

时间:2020-01-22 20:14:02      阅读:70      评论:0      收藏:0      [点我收藏+]

给定两个字符串\(s1\)\(s2\),求\(s2\)\(s1\)中所有的出现位置。

\(KMP\)有递推的感觉。

在模式串\(str2\)中,对于每一位\(str2(i)\) ,它的\(kmp\)数组应当是记录一个位置\(j\),\(j \leqslant i\),并且满足\(str2(i)=str2(j)\),并且在\(j!=1\)时理应满足\(str2(1)\)\(str2(j-1)\)分别与\(str2(i-j+1)\)\(str2(i-1)\)按位相等。

每次位置指针\(i++\)时,失配指针\(j\)至多增加一次,所以\(j\)至多增加\(len\)次,从而至多减少\(len\)次,所以就是 \(O(len_N+len_M)=O(n+m)\)的复杂度。

最小循环节(将这个循环节无限赋值后能表达出这个串)长度为\(n-nxt[n]\)

\(code\)

l1=strlen(s1+1);
l2=strlen(s2+1);
for(int i=2;i<=l2;++i)
{
    while(j&&s2[i]!=s2[j+1]) j=nxt[j];
    if(s2[i]==s2[j+1]) j++;
    nxt[i]=j;
}
j=0;
for(int i=1;i<=l1;++i)
{
    while(j&&s1[i]!=s2[j+1]) j=nxt[j];
    if(s1[i]==s2[j+1]) j++;
    if(j==l2)
    {
        ans++;//匹配成功
        j=nxt[j];
    }
}

KMP

原文:https://www.cnblogs.com/lhm-/p/12229440.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!