Java怎么实现KMP算法
发表于:2025-11-10 作者:千家信息网编辑
千家信息网最后更新 2025年11月10日,本篇内容主要讲解"Java怎么实现KMP算法",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Java怎么实现KMP算法"吧!KMP 算法KMP (Knuth
千家信息网最后更新 2025年11月10日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安全错误
数据库的锁怎样保障安全
美国网络安全 斯诺登
公网服务器环境
象右看齐网络技术
鞍山每搜网络技术有限公司
云南生鲜软件开发
c 编写web服务器端
东至口碑好软件开发服务代理品牌
用友调拨单数据库表
上海出海通网络技术有限公司
安卓软件开发大会2020年
镁光服务器颗粒频率区分
河南服务器电源哪里有
数据库性能优化可以从哪方面考虑
永康软件开发
程序员需要掌握的几种数据库
火电网络安全防护
深圳小程序软件开发服务
现场管理软件开发架构
软件开发廉政风险点
网络安全等保测评员证书
java消息服务器
诺必行词典数据库
登录远程服务器的方式有那些
如何优化服务器系统linux
渣打银行 软件开发职级
服务器如何加内存
adsl网络技术
绿盾更改服务器地址
怎样比较软件开发方案
最新常用数据库技术