题目:
key:KMP算法
KMP (Knuth-Morris-Pratt) 算法是一种高效的字符串匹配算法,用于在一个文本串(主串)中查找一个模式串(子串)。与传统的朴素匹配算法相比,KMP 算法具有更高的效率,因为它避免了不必要的回溯。
KMP 算法的基本思想
避免回溯: 传统方法在发现字符不匹配时,会退回到主串的前面位置重新开始比较,而 KMP 算法利用模式串自身的特性来避免这种回溯。
部分匹配表 (Next 数组): KMP 算法的核心在于构建一个“部分匹配表”(有时称为 Next 数组),该表记录了模式串中每个前缀的最大相等前后缀的长度,从而可以在不匹配时快速跳过某些比较。
KMP 算法的步骤
构建部分匹配表 (Next 数组):
对于模式串 P,构建一个数组 next,其中 next[i] 表示 P[0…i-1] 的最大相等前后缀的长度。
初始化 next[0] = -1,并设两个指针 j = -1 和 k = 0。
当 k < P.length 时,如果 P[k] == P[j+1],则 next[k+1] = j + 1,并且 j = j + 1;否则,如果 j > -1,则 j = next[j];否则 next[k+1] = 0,并且 k = k + 1。
匹配过程:
设两个指针 i 和 j,分别指向主串 T 和模式串 P 的当前比较位置。
如果 T[i] == P[j],则 i = i + 1 和 j = j + 1。
如果 j == P.length,则找到了一个匹配,此时可以报告匹配的位置或采取其他行动。
如果 T[i] != P[j] 且 j > 0,则 j = next[j];否则 i = i + 1。