从今天开始, 小白我将带大家开启 java 数据结构 & 算法的新篇章.
kmp (knuth-morris-pratt), 是一种改进的字符串匹配算法. kmp 算法解决了暴力匹配需要高频回退的问题, kmp 算法在匹配上若干字符后, 字符串位置不需要回退, 从而大大提高效率. 如图:
举个例子 (字符串 “abcabcdef” 匹配字符串 “abcdef”):
a
bc播音与主持艺术abcdef a
bcdefa
bcabcdef a
bcdefa 和 a 匹配2ab
cabcdef ab
cdefab
cabcdef ab
cdefab 和 ab 匹配3abc
abcdef abc
defabc
abcdef abc
defabc 和 abc 匹配4abca
bcdef abcd
efabca
bcdef abcd
efabca 和 abcd 不匹配, 回退. 暴力匹配回退到索引 1, 即 “b”, kmp 算法索引跳置 3, 即 “a”5ab
cabcdef a
bcdefabca
bcdef a
bcdef暴力匹配 b 和 a 不匹配, 后移. kmp 算法 a 和 a 匹配6abc
abcdef a
bcdefabcab
cdef ab
cdef暴力匹配 c 和 a 不匹配, 后移. kmp 算法 ab 和 ab 匹配7abca
bcdef a
bcdefabcabc
def abc
def暴力匹配 a 和 a 匹配. kmp 算法 abc 和 abc 匹配8abcab
cdef ab
cdefabcabcd
ef abcd
ef暴力匹配 ab 和 ab 匹配. kmp 算法 abcd 和 abcd 匹配9abcabc
def abc
defabcabcde
f abcde
f暴力匹配 abc 和 abc 匹配. kmp 算法 abcde 和 abcde 匹配10abcabcd
ef abcd
efabcabcdef abcdef
暴力匹配 abcd 和 abcd 匹配. kmp 算法 abcdef 和 abcdef 匹配 , 匹配完成11abcabcde
f abcde
fabcabcdef abcdef
暴力匹配 abcde 和 abcde 匹配. kmp 算法匹配完成12abcabcdef abcdef
abcabcdef abcdef
暴力匹配 abcd 和 abcd 匹配, 匹配完成. kmp 算法匹配完成部分匹配表 (partial match table) 指的是 “前缀” 和 “后缀” 的最长共有元素的特殊称谓长度.
举个例子, 字符串 “abcdabd” 的前缀与后缀:
重点:
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; } // 匹配 windows7优化设置 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++; } el { //一旦不匹配成功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算法的文章就介绍到这了,更多相关java kmp 算法内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!
本文发布于:2023-04-05 01:43:12,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/a1d776675a48c97ab22bbe1a8ee93829.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:Java 数据结构与算法系列精讲之KMP算法.doc
本文 PDF 下载地址:Java 数据结构与算法系列精讲之KMP算法.pdf
留言与评论(共有 0 条评论) |