码迷,mamicode.com
首页 > 其他好文 > 详细

KMP

时间:2018-11-26 20:05:15      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:next数组   void   ext   code   i++   pre   第一个   int   不可   

目录

KMP

得到NEXT数组

void getNEXT() {
    int i = 0, j = NEXT[0] =-1;
    while (i<Find.size()){
        if (j == -1 || Find[i] == Find[j]) {
            i++;j++;
            NEXT[i] = j;
            
        }
        else {
            j = NEXT[j];
        }
    }
}

在文本串中找到第一个匹配串的位置

int FirstKmp() {
    int i = 0, j = 0;
    while (i < a.size()) {
        if (j == -1 || a[i] == Find[j]) {
            i++, j++;
            if (j == Find.size()) {
                return i - j;
            }
        }
        else j = NEXT[j];
    }
    return -1;
}//在a中找到第一个Find的位置

查找文本串中有多少匹配串

可以重叠的

int ManyKmp() {
    int i = 0, j = 0,ans=0;
    while (i < a.size()) {
        if (j == -1 || a[i] == Find[j]) {
            i++, j++;
            if (j == Find.size()) {
                ans++;
                j = NEXT[j];
            }
        }
        else j = NEXT[j];   
    }
    return ans;
} //在a中找几个可以重叠的Find

不可以重叠的

int ManyKMP() {
    int i = 0, j = 0, ans = 0;
    while (i < a.size()) {
        if (j == -1 || a[i] == Find[j]) {
            i++, j++;
            if (j == Find.size()) {
                ans++;
                j = 0;
            }
        }
        else j = NEXT[j];
    }
    return ans;
}//在a中找几个不可以重叠的Find

其他小结

如果一个字符串满足 len%(len-next[len])==0,则这个字符串是一个周期串(存在最小循环节),循环次数为 len / ( len-next[len] )
如果 len%(len-next[len])!=0,这个字符串也存在循环节,但是最后一个循环节不完整

KMP

标签:next数组   void   ext   code   i++   pre   第一个   int   不可   

原文地址:https://www.cnblogs.com/fjqfjq/p/10021685.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!