假设你有一个字符串
Hello World!!!
,你想搜索
Head Up
。
Hello World!!!
Head Up
^
当您在第一和第二个字符时,第一个条件适用(第一种情况:子字符串继续),在标记位置的情况下,字符不匹配但您已经在子字符串匹配中(到此为止匹配了2个字符),这种情况对应于第二个条件(第二种情况:它不匹配,但我们可以回退)。第三种情况是当您不匹配模式的第一个字符时。
第二个条件是必要的,因为您可以使用匹配字符直到不匹配的信息,以避免不必要的比较,您已经知道结果(跳过字符串中您已经知道起始部分与模式不匹配的字符)。
例如:对于字符串HeHello World!!!并搜索Hello。
HeHello World!!!
Hello
^ when you miss match this character using the table of KMP you known that
could skip 2 characters because
HeHello World!!!
Hello
^ this would miss match
在构建"HeHello"的模式表时,假设"^"表示"cnd","*"表示"pos"。起始点为"pos = 2"和"cnd = 0"(但在检查模式时,是使用"pos - 1 = 1")。
HeHeHello T [-1,0,0,0,0,0,0,0,0]
^* comparing 0 with 1 go to condition 3 cnd = 0, pos = 2
_
HeHeHello T [-1,0,0,1,0,0,0,0,0]
^ * comparing 0 with 2 go to condition 1 cnd = 0, pos = 3
_
HeHeHello T [-1,0,0,1,2,0,0,0,0]
^ * comparing 1 with 3 go to condition 1 cnd = 1, pos = 4
_
HeHeHello T [-1,0,0,1,2,3,0,0,0]
^ * comparing 2 with 4 go to condition 1 cnd = 2, pos = 5
_
HeHeHello T [-1,0,0,1,2,3,4,0,0]
^ * comparing 3 with 5 go to condition 1 cnd = 3, pos = 6
HeHeHello T [-1,0,0,1,2,3,4,0,0]
^ * comparing 4 with 6 go to condition 2 (cnd = T[cnd], cnd = T[4] = 2)
HeHeHello T [-1,0,0,1,2,3,4,0,0]
^ * comparing 2 with 6 go to condition 2 (cnd = T[cnd], cnd = T[2] = 0)
...