问题描述
为什么我们在向后移动时(当存在不匹配时)从 KMP 算法中已经构造的数组中获取值,而不是从第一个开始?还有它是如何保证从那个点开始,值是好的?
例如:
id = 0 1 2 3 4 5 6 7 8
s = a a b a a b a a a
arr 0 1 0 1 2 3 4 5 2
考虑到 i = 0
和 j = 1
,我们开始算法。
为什么我们有移动的条件:
i > 0 and charat(i) != charat(j) then i = arr[i-1]
KMP 中的这条线究竟是如何工作的?
解决方法
arr
专门用于利用您之前已匹配的内容,以便在发生不匹配时抢占先机。
例如:假设您已匹配 aabaa
,但下一个字符不是预期的 b
,而是 a
。这意味着我们到目前为止处理的结束为 aa
,这就是为什么 arr[i-1]
是 2:我们在开始时匹配 aa
的位置我们正在寻找的字符串。