当出现不匹配时,为什么我们从 KMP 算法中已经构造的数组中获取值,而不是从第一个开始?

问题描述

为什么我们在向后移动时(当存在不匹配时)从 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 = 0j = 1,我们开始算法。

为什么我们有移动的条件:

i > 0 and charat(i) != charat(j) then i = arr[i-1]

KMP 中的这条线究竟是如何工作的?

解决方法

arr 专门用于利用您之前已匹配的内容,以便在发生不匹配时抢占先机。

例如:假设您已匹配 aabaa,但下一个字符不是预期的 b,而是 a。这意味着我们到目前为止处理的结束aa,这就是为什么 arr[i-1] 是 2:我们在开始时匹配 aa 的位置我们正在寻找的字符串。