关于KMP算法的改进nextval数组と坏字符规则

kmp

-----google
next 011121 【这里next的意思是如果匹配失败,下一步对比哪一个位置的字符】

与goolggoogle相对比时
第四位与g不相等时,按照kmp算法,需要将第一位与第四位再对比一次,但是对于google来讲,第一个和第四个都是g,所以会造成多余的步骤,这里引入nextval数组

nextval

-----a a a a b
next 0 1 2 3 4
nextval 0 00 0 4

如果这个字符与next数字位置的字符一样,那么nextval就直接取那个位置上的nextval值,如果不一样,那么就把next的值直接复制下来。


坏字符规则

对于主串中的字符,如果不在x中,那么delta[x]就是模式串的长度,如果x在里面,那么delta[x]就是j-i,j是模式串最末元素的索引值,i值字符在模式串中最右出现的位置
T=abcacabdc
S=abd
T串中的a,在S中出现了,在S中总共有3个元素,a出现的位置是1,所以delta[a]=3-1=2
delta[b]=3-2=1
delta[c]=3
delta[d]=3-3=0
所以T为213232103

比较的时候是从后往前比较,adb先于abc比较,c与b不相等,delta[c]=3,所以往后移动三位,adb再与aca比较,b与a不相等,delta[a]=2,所以往后移动两位

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值