4.2.2字符串KMP算法

 

 对朴素模式匹配算法的优化:

 

 

 当我们匹配最后一个字符才发现匹配失败。

那么前面这些字符一定是与模式串对应的。

 通过模式串的部分匹配

 

朴素模式匹配算法优化思路:

 不匹配的字符之前,一定是和模式串一致的。

 可以跳过中间好几个没有必要的对比

前面5个已知字符中我们已知ab当i=4和i=5时。

 我们得到的结论并不依赖于主串,只与模式串有关。

 前面这几个字符肯定是与模式串匹配的。

 

 

 

 当第五个元素匹配失败后,主串指针i保持不变,模式串指针j=2

那如果第4个元素匹配失败呢?
主串指针i保持不变,模式串指针j=2

 可令主串指针i不变,模式串指针j=1

 

 

 

 IN CONCLUSION

 

 现在呢,我们知道当第六个元素匹配失败,可令主串指针i不变,模式串指针j=3。

那我们接下来改一下例子哈

 我们发现第5个元素匹配失败,那接下来令主串指针i不变,模式串指针j=2。

 我们发现第2个元素发生失配,令主串指针i不变,模式串指针j=1.

 第一个元素匹配失败,匹配下一个相邻字串,令j=0,i++,j++

 中间省略,与上述相同。if

 

 

此时j超过了模式串的匹配范围而停止。

 

 这个算法指对模式串T="abaabc"生效

第i个元素匹配失效,next[i]

模式串指针的数值由next数组存储。

 这就是KMP算法

特殊情况下,if(j==0){i++;j++}

process:

(1)根据模式串T,求出next数组。

(2)利用next数组进行匹配(主串指针不回溯)

 传入主串S,模式串T,以及与模式串相关的next数组。

我们来进行一个对比

改变的只是我们圈起来的部分。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值