KMP算法--解决字符串匹配问题

关于KMP算法,自己给出了一些讲解,写的不太好,见谅!

原理:

举例,给出文本串和模式串,判断文本串中是否包含模式串

原理是找到最长相等的前后缀

这里要用到前缀表,涉及到前缀和后缀的概念。

前缀:包含首字母,不包含尾字母的所有子串

对于模式串,它的前缀是:

a
aa
aab
aaba
aabaa

后缀:包含尾字母不包含首字母的所有子串

模式串的后缀是: 

f
af
aaf
baaf
abaaf

 前缀表就是:

a (子串)0        (表示相等前后缀的数量)
aa1
aab0
aaba1
aabaa2
aabaaf0

过程:找前面子串的最长相等前后缀。 很显然,最长相等前后缀是2,会跳到下标为2处,也就是b,从b开始重新匹配(这也是前缀表的特性)。

解释:寻找最长相等前后缀的长度意味着这里有一个后缀aa, 前面也有一个与其相等的前缀aa,我们在这个后缀的后面发生不匹配了,我们就要找与其相等的前缀的后面也就是 b 开始匹配。最长相等前后缀是2,那前缀的后面 b  的下标就正好是前缀的长度,因为索引是从0开始的。

代码实现:

用next数组表示前缀表,next数组的核心:遇见冲突,向前回退。

next数组表示如图所示:

如何得到next数组,代码如下,感兴趣可以自行研究一下:

void getNext( String s){
        //i表示后缀末尾,j表示前缀末尾
        int j=0;
        int i;
        int next[0];
        for(i=1;i<s.length();i++)   i++;
        char[] ch = s.toCharArray();
        while (j>0&&ch[i]!=ch[j]) j=next[j-1];
        if(ch[i]==ch[j]) j++;
        next[i]=j;

    }

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值