通过查阅相关书籍和博客,大概总结下KMP算法,主要说一下对next[]数组的理解
字串匹配
S: ababcababa
P: ababa
重点在于求P的next[]数组
规定next[1]=0
P的第2个字符为b,与第1个字符a不同,所以next[2]=0
P的第3个字符为a,与第1个字符a相同,所以next[3]=1
P的第3到4的字符为ab,与第1到2的字符ab相同,所以next[4]=2
p的第3到5的字符为aba,与第1到3的字符aba相同,所以next[5]=3
所以:
i | 1 | 2 | 3 | 4 | 5 |
P[I] | a | b | a | b | a |
next[i] | 0 | 0 | 1 | 2 | 3 |
另外举个算法导论上的例子说明next[]的求法
i | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
P[i] | a | b | a | b | a | b | a | b | c | a |
next[i] | 0 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 0 | 1 |
,
对于KMP使用next[]进行匹配的过程如下
S: ababcababa
P: ababa
第一次匹配
i | 1 | 2 | 3 | 4 | 5 | |||||
S | a | b | a | b | c | a | b | a | b | a |
P | a | b | a | b | a |
发现到第5位的时候不匹配了
在这之前一共匹配了4位
字串P往右移动i-next[i]位,即4-next[4]
通过查表得next[4]=2
故字串P往右移动2位
第二次匹配
i | 1 | 2 | 3 | 4 | 5 | |||||
S | a | b | a | b | c | a | b | a | b | a |
P | a | b | a | b | a |
发现到第3位的时候不匹配了
在这之前一共匹配了2位
字串P往右移动2-next[2]位
通过查表得next[2]=0
故字串P往右移动2位
第三次匹配
i | 1 | 2 | 3 | 4 | 5 | |||||
S | a | b | a | b | c | a | b | a | b | a |
P | a | b | a | b | a |
发现到第1位的时候不匹配了
在这之前一共匹配了0位
字串P往右移动1位
第四次匹配的时候成功
第一次写博客,多多包涵