Java怎么实现KMP算法
发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,本篇内容主要讲解"Java怎么实现KMP算法",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Java怎么实现KMP算法"吧!KMP 算法KMP (Knuth
千家信息网最后更新 2026年11月03日Java怎么实现KMP算法
本篇内容主要讲解"Java怎么实现KMP算法",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Java怎么实现KMP算法"吧!
KMP 算法
KMP (Knuth-Morris-Pratt), 是一种改进的字符串匹配算法. KMP 算法解决了暴力匹配需要高频回退的问题, KMP 算法在匹配上若干字符后, 字符串位置不需要回退, 从而大大提高效率. 如图:
举个例子 (字符串 "abcabcdef" 匹配字符串 "abcdef"):
| 次数 | 暴力匹配 | KMP 算法 | 说明 |
|---|---|---|---|
| 1 | abcabcdef abcdef | abcabcdef abcdef | a 和 a 匹配 |
| 2 | abcabcdef abcdef | abcabcdef abcdef | ab 和 ab 匹配 |
| 3 | abcabcdef abcdef | abcabcdef abcdef | abc 和 abc 匹配 |
| 4 | abcabcdef abcdef | abcabcdef abcdef | abca 和 abcd 不匹配, 回退. 暴力匹配回退到索引 1, 即 "b", KMP 算法索引跳置 3, 即 "a" |
| 5 | abcabcdef abcdef | abcabcdef abcdef | 暴力匹配 b 和 a 不匹配, 后移. KMP 算法 a 和 a 匹配 |
| 6 | abcabcdef abcdef | abcabcdef abcdef | 暴力匹配 c 和 a 不匹配, 后移. KMP 算法 ab 和 ab 匹配 |
| 7 | abcabcdef abcdef | abcabcdef abcdef | 暴力匹配 a 和 a 匹配. KMP 算法 abc 和 abc 匹配 |
| 8 | abcabcdef abcdef | abcabcdef abcdef | 暴力匹配 ab 和 ab 匹配. KMP 算法 abcd 和 abcd 匹配 |
| 9 | abcabcdef abcdef | abcabcdef abcdef | 暴力匹配 abc 和 abc 匹配. KMP 算法 abcde 和 abcde 匹配 |
| 10 | abcabcdef abcdef | abcabcdef abcdef | 暴力匹配 abcd 和 abcd 匹配. KMP 算法 abcdef 和 abcdef 匹配 , 匹配完成 |
| 11 | abcabcdef abcdef | abcabcdef abcdef | 暴力匹配 abcde 和 abcde 匹配. KMP 算法匹配完成 |
| 12 | abcabcdef abcdef | abcabcdef abcdef | 暴力匹配 abcd 和 abcd 匹配, 匹配完成. KMP 算法匹配完成 |
部分匹配表
部分匹配表 (Partial Match Table) 指的是 "前缀" 和 "后缀" 的最长共有元素的长度.
举个例子, 字符串 "ABCDABD" 的前缀与后缀:
| 字符串 | 前缀 | 后缀 | 共同部分 | 值 |
|---|---|---|---|---|
| A | NaN | NaN | NaN | 0 |
| AB | A | B | NaN | 0 |
| ABC | A, AB | C, BC | NaN | 0 |
| ABCD | A, AB, ABC | D, CD, BCD | NaN | 0 |
| ABCDA | A, AB, ABC, ABCD | A, DA, CDA, BCDA | A | 1 |
| ABCDAB | A, AB, ABC, ABCD, ABCDA | B, AB, DAB, CDAB, BCDAB | AB | 2 |
| ABCDAB | A, AB, ABC, ABCD, ABCDA, ABCDAB | D, BD, ABD, DABD, CDABD, BCDABD | NaN | 0 |
KMP 算法实现
重点:
KMP 算法中移动的位数 = 已匹配的字符数 - 对应的部分匹配值
import java.util.Arrays;public class KMPMatch { public static int Match(String str1, String str2, int[] next) { // 初始化索引 int i = 0; int j = 0; for (; i < str1.length(); i++) { if (j > 0 && str1.charAt(i) != str2.charAt(j)) { // 不匹配, 回退 i = i - next[j - 1]; j = 0; } // 匹配 if (str1.charAt(i) == str2.charAt(j)) { j++; } // 返回索引 if (j == str2.length()) { return i - j + 1; } } return -1; } // 部分匹配 public static int[] getNext(String s) { // 定义数组 int next[] = new int[s.length()]; // 初始化i, j int i = 0; int j = -1; next[0] = -1; // 遍历 while (i < s.length() - 1) { if (j == -1 || s.charAt(i) == s.charAt(j)) { // 匹配成功 next[i] = j + 1; i++; j++; } else { //一旦不匹配成功j回退到-1 j = -1; } } return next; } public static void main(String[] args) { // 字符串1 String str1 = "BBCABCDAB ABCDABD"; // 字符串2 String str2 = "ABCDABD"; // 匹配表 int[] next = getNext(str2); System.out.println(Arrays.toString(next)); // KMP算法 int result = Match(str1, str2, next); System.out.println(result); }}输出结果:
[0, 0, 0, 0, 1, 2, 0]
10
到此,相信大家对"Java怎么实现KMP算法"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
算法
暴力
字符
字符串
部分
索引
前缀
后缀
成功
例子
内容
后移
学习
实用
更深
最长
位数
位置
元素
兴趣
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网科技海报
新华互联网科技
金融科技 互联网金融
互联网医疗科技
互联网与新科技
互联网科技大会
美国互联网前沿科技
衡水科技产业互联网平台
中国最先进互联网科技公司
湖南洣水互联网科技有限公司扣款
互联网科技实习生岗位职责
贵州叶脉互联网科技有限公司所属行业
湖北码尼互联网科技有限公司电话
工业互联网山东科技大学
高科技互联网套路
领航科技大厦互联网公司
互联网风格科技公司名称
互联网对科技影响
现代互联网科技公司
小牛互联网科技有限公司地址
互联网科技公司简介
科技企业和互联网企业
科技信息互联网
金融科技 互联网金融
云电互联网科技
互联网科技生活的内容
随着互联网科技发展
互联网科技扶贫时间
用友工业互联网科技发展
厦门江牛科技互联网