在计算机科学中,KMP算法(Knuth-Morris-Pratt算法)是一种高效的字符串匹配算法。它由Donald Knuth、Vaughan Pratt 和 James H. Morris 在1977年独立提出。与暴力匹配不同,KMP算法通过预处理模式串(pattern),避免了主串(text)指针的回溯,从而将时间复杂度从 O(n×m) 优化到 O(n+m),其中 n 是主串长度,m 是模式串长度。
假设我们要在一个长文本中查找某个关键词。如果使用朴素的暴力匹配方法,一旦发现不匹配,就要将模式串整体右移一位,再从头开始比较。这种做法在最坏情况下效率极低。
而 Java实现KMP 的核心思想是:当发生失配时,利用已匹配部分的信息,让模式串尽可能多地向右滑动,而不是只移动一位。这就需要一个“部分匹配表”(也叫 next 数组)来记录模式串中每个位置之前的最长公共前后缀长度。

next[i] 表示模式串中前 i 个字符(即 pattern[0..i-1])的最长相等前后缀的长度。例如,模式串 "ABABC" 的 next 数组为 [0, 0, 1, 2, 0]。
构建 next 数组的过程如下:
下面是一个完整的 模式匹配算法 的 Java 实现,包含 next 数组构建和主匹配过程:
public class KMP { // 构建 next 数组 public static int[] buildNext(String pattern) { int m = pattern.length(); int[] next = new int[m]; int j = 0; // 前缀指针 for (int i = 1; i < m; i++) { while (j > 0 && pattern.charAt(i) != pattern.charAt(j)) { j = next[j - 1]; } if (pattern.charAt(i) == pattern.charAt(j)) { j++; } next[i] = j; } return next; } // KMP 主匹配函数 public static int kmpSearch(String text, String pattern) { if (pattern.isEmpty()) return 0; int n = text.length(); int m = pattern.length(); int[] next = buildNext(pattern); int j = 0; // 模式串指针 for (int i = 0; i < n; i++) { while (j > 0 && text.charAt(i) != pattern.charAt(j)) { j = next[j - 1]; } if (text.charAt(i) == pattern.charAt(j)) { j++; } if (j == m) { return i - m + 1; // 返回首次匹配位置 } } return -1; // 未找到 } // 测试示例 public static void main(String[] args) { String text = "ABABDABACDABABCABCABCABC"; String pattern = "ABABC"; int index = kmpSearch(text, pattern); System.out.println("匹配位置: " + index); // 输出: 10 }}1. 时间复杂度:构建 next 数组 O(m),主匹配 O(n),总时间复杂度 O(n + m)。
2. 空间复杂度:O(m),用于存储 next 数组。
3. 该算法特别适合在大文本中多次搜索同一模式串的场景,因为 next 数组只需构建一次。
4. 注意边界条件,如空字符串、模式串比主串长等情况。
KMP算法是字符串处理中的经典算法,掌握它不仅能提升编程能力,还能在面试和实际开发中解决高效查找问题。通过本文的详细讲解和 Java实现KMP 的完整代码,即使是编程小白也能理解其原理并动手实现。记住,理解 next 数组的构建逻辑是掌握 KMP 的关键!
希望这篇关于 KMP算法、字符串匹配、Java实现KMP 和 模式匹配算法 的教程对你有所帮助!
本文由主机测评网于2025-12-18发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/2025129611.html