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,所以往后移动两位