欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 锐评 > 关键词查找【Knuth-Morris-Pratt (KMP) 算法】

关键词查找【Knuth-Morris-Pratt (KMP) 算法】

2024/10/25 6:26:21 来源:https://blog.csdn.net/qq_43197840/article/details/140680860  浏览:    关键词:关键词查找【Knuth-Morris-Pratt (KMP) 算法】

一个视频让你彻底学懂KMP算法_哔哩哔哩_bilibili

KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。

第一步:计算模式串(子串)和next[j]数组

模式串 前2位字母的next[j]固定是0 和 1

后续字母的nex[j],aba 里的第三位的next[j] =首尾相同子字符串长度+1,ab首尾相同子字符串长度为0

后续字母的nex[j],abaa 里的第四位的next[j] =首尾相同子字符串长度+1,aba首尾相同子字符串(a)长度为1

后续字母的nex[j],abaab 里的第五位的next[j] =首尾相同子字符串长度+1,abaa首尾相同子字符串(a)长度为1

后续字母的nex[j],abaabc 里的第六位的next[j] =首尾相同子字符串长度+1,abaaab首尾相同子字符串(ab)长度为2

第六位第七位 以此类推。。。

第二步:主串和子串比对过程中遇到不匹配字母时,用子串里不匹配的字母去数组里找 next[j]

下图:c和b不匹配,用b去数组里找到nex[j]=1,图二j挪到第一位,继续比较

下图:c和a不匹配,用a去数组里找到nex[j]=0,图二j挪到第0位,然后i和j 都往后移一位继续比较

下图:a和c不匹配,用c去数组里找到nex[j]=3,图二j挪到第3位,继续比较

实现代码如下:

public class KMP {// 计算部分匹配表 (LPS)private static int[] computeLPSArray(String pattern) {int[] lps = new int[pattern.length()];int length = 0; // 长度为当前最长前缀后缀int i = 1;while (i < pattern.length()) {if (pattern.charAt(i) == pattern.charAt(length)) {length++;lps[i] = length;i++;} else {if (length != 0) {length = lps[length - 1]; // 回溯} else {lps[i] = 0;i++;}}}return lps;}// KMP 查找算法public static boolean kmpSearch(String text, String pattern) {int[] lps = computeLPSArray(pattern);int i = 0; // 文本的索引int j = 0; // 模式串的索引while (i < text.length()) {if (pattern.charAt(j) == text.charAt(i)) {i++;j++;}if (j == pattern.length()) {return true; // 找到匹配} else if (i < text.length() && pattern.charAt(j) != text.charAt(i)) {if (j != 0) {j = lps[j - 1]; // 根据 LPS 表回溯} else {i++;}}}return false; // 未找到匹配}public static void main(String[] args) {String text = "aaaaaaac";String pattern = "aaaac";boolean found = kmpSearch(text, pattern);if (found) {System.out.println("子串 \"" + pattern + "\" 在主串中出现过。");} else {System.out.println("子串 \"" + pattern + "\" 在主串中未出现。");}}
}

相关:
https://blog.csdn.net/qq_43197840/article/details/140680621?spm=1001.2014.3001.5501
https://blog.csdn.net/qq_43197840/article/details/140679425?spm=1001.2014.3001.5501

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com