kmp算法 Java

时间: 2023-08-27 22:15:14 浏览: 32
回答: KMP算法是一种改进的字符串匹配算法,通过利用匹配失败后的信息来减少模式串与主串的匹配次数,从而达到快速匹配的目的。它的核心是通过一个next()函数实现,该函数包含了模式串的局部匹配信息。与BF算法不同,KMP算法在匹配过程中可以跳过一些已经比较过的字符,从而提高了匹配的效率。在Java中,可以使用KMP算法来实现字符串匹配。可以通过KMP类中的KMP方法来进行匹配操作,在该方法中使用了next数组来优化匹配过程。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [KMP算法详解以及Java代码实现](https://blog.csdn.net/weixin_43767015/article/details/128022342)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [【数据结构】KMP算法的详解以及使用JAVA来实现](https://blog.csdn.net/Superkom666/article/details/128254841)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

相关推荐

KMP算法是一种字符串匹配算法,用于在一个文本串 S 内查找一个模式串 P 的出现位置。下面是KMP算法的Java实现: java public class KMP { public static void main(String[] args) { String text = "ABABDABACDABABCABAB"; String pattern = "ABABCABAB"; int[] next = getNext(pattern); int index = kmp(text, pattern, next); if (index != -1) { System.out.println("Pattern found at index " + index); } else { System.out.println("Pattern not found"); } } /** * KMP算法 * * @param text 文本串 * @param pattern 模式串 * @param next 模式串的next数组 * @return 模式串在文本串中的起始位置,未找到返回-1 */ public static int kmp(String text, String pattern, int[] next) { int i = 0; int j = 0; while (i < text.length() && j < pattern.length()) { if (j == -1 || text.charAt(i) == pattern.charAt(j)) { i++; j++; } else { j = next[j]; } } if (j == pattern.length()) { return i - j; } else { return -1; } } /** * 获取模式串的next数组 * * @param pattern 模式串 * @return 模式串的next数组 */ public static int[] getNext(String pattern) { int[] next = new int[pattern.length()]; int i = 0; int j = -1; next[0] = -1; while (i < pattern.length() - 1) { if (j == -1 || pattern.charAt(i) == pattern.charAt(j)) { i++; j++; next[i] = j; } else { j = next[j]; } } return next; } } 以上代码中,kmp方法接收文本串、模式串和模式串的next数组作为参数,返回模式串在文本串中的起始位置。getNext方法用于获取模式串的next数组。在KMP算法中,next数组表示模式串中每个字符之前的子串中最长可匹配前缀和后缀的长度。
KMP算法的实现是通过计算模式串的next数组,然后在主串中进行匹配。在Java中,可以按照以下步骤实现KMP算法: 1. 首先,定义一个函数来计算模式串的next数组,即模式串T中每一个长度为j (0 < j < T.length) 的前缀所对应的next[j]的值。这个函数可以按照以下步骤进行计算: - 初始化一个长度为T.length的next数组,并将其所有元素初始化为0。 - 使用两个指针i和j,分别指向模式串的第一个字符和第二个字符。 - 循环遍历模式串的字符: - 如果T[i]等于T[j],则将next[j+1]的值设置为j+1,并将i和j都加1。 - 如果T[i]不等于T[j],则判断j的值: - 如果j等于0,则将next[j+1]的值设置为0,并将i加1。 - 如果j不等于0,则将j更新为next[j]的值。 2. 定义一个函数来进行匹配,接收一个主串S和一个模式串T作为参数。这个函数可以按照以下步骤进行匹配: - 使用两个指针i和j,分别指向主串和模式串的第一个字符。 - 循环遍历主串的字符: - 如果S[i]等于T[j],则将i和j都加1。 - 如果S[i]不等于T[j],则判断j的值: - 如果j等于0,则将i加1。 - 如果j不等于0,则将j更新为next[j]的值。 3. 在匹配过程中,如果j的值等于模式串的长度,则说明匹配成功,返回主串中匹配的起始位置。 下面是KMP算法的Java实现代码: java public class KMP { public int kmpMatch(String S, String T) { char[] sArr = S.toCharArray(); char[] tArr = T.toCharArray(); int[] next = getNext(T); int i = 0, j = 0; while (i < sArr.length && j < tArr.length) { if (sArr[i] == tArr[j]) { i++; j++; } else if (j == 0) { i++; } else { j = next[j]; } } if (j == tArr.length) { return i - j; } else { return -1; } } private int[] getNext(String T) { char[] tArr = T.toCharArray(); int[] next = new int[tArr.length]; int i = 0, j = -1; next[0] = -1; while (i < tArr.length - 1) { if (j == -1 || tArr[i] == tArr[j]) { i++; j++; next[i] = j; } else { j = next[j]; } } return next; } }
以下是KMP算法的Java实现示例: java import java.util.ArrayList; import java.util.List; public class KMPAlgorithm { public static List<Integer> kmp(String text, String pattern) { List<Integer> positions = new ArrayList<>(); int n = text.length(); int m = pattern.length(); int[] lps = buildLPS(pattern); int i = 0; // text中的指针 int j = 0; // pattern中的指针 while (i < n) { if (text.charAt(i) == pattern.charAt(j)) { i++; j++; } if (j == m) { positions.add(i - j); j = lps[j - 1]; } else if (i < n && text.charAt(i) != pattern.charAt(j)) { if (j != 0) { j = lps[j - 1]; } else { i++; } } } return positions; } private static int[] buildLPS(String pattern) { int m = pattern.length(); int[] lps = new int[m]; int len = 0; // 最长公共前后缀的长度 lps[0] = 0; // 第一个字符没有最长公共前后缀 for (int i = 1; i < m; ) { if (pattern.charAt(i) == pattern.charAt(len)) { lps[i] = len + 1; len++; i++; } else { if (len != 0) { len = lps[len - 1]; } else { lps[i] = 0; i++; } } } return lps; } public static void main(String[] args) { String text = "ABABDABACDABABCABAB"; String pattern = "ABABCABAB"; List<Integer> positions = kmp(text, pattern); if (positions.isEmpty()) { System.out.println("Pattern not found in the text."); } else { System.out.print("Pattern found at positions: "); for (int pos : positions) { System.out.print(pos + " "); } System.out.println(); } } } 以上代码是KMP算法的Java实现示例,用于在文本串中查找模式串的出现位置。你可以将文本串和模式串替换为你自己的字符串进行测试。运行程序后,它会输出模式串在文本串中的出现位置。如果没有找到匹配的位置,则会输出"Pattern not found in the text."。

最新推荐

kMP算法JavakMP算法JavakMP算法JavakMP算法Java

kMP算法JavakMP算法JavakMP算法JavakMP算法JavakMP算法JavakMP算法JavakMP算法JavakMP算法JavakMP算法JavakMP算法JavakMP算法JavakMP算法JavakMP算法JavakMP算法JavakMP算法JavakMP算法JavakMP算法JavakMP算法Java...

java数据结构与算法.pdf

包含了各种数据结构和算法(java)的实现方式和详解(图解),包括单双链表、环形链表(约瑟夫问题)、栈、后缀表达式、中缀表达式转后缀表达式、迷宫问题、八大排序算法、多种查找算法、哈希表、二叉树实现以及操作...

判断素数.py python源码实现判断

素数 python源码实现判断

plc控制交通灯毕业设计论文.doc

plc控制交通灯毕业设计论文.doc

"阵列发表文章竞争利益声明要求未包含在先前发布版本中"

阵列13(2022)100125关于先前发表的文章竞争利益声明声明未包含在先前出现的以下文章的发布版本问题 的“数组”。 的 适当的声明/竞争利益由作者提供的陈述如下。1. https://doi.org/10.1016/j.array.2020.100021“Deeplearninginstatic,metric-basedbugprediction”,Array,Vol-ume6,2020,100021,竞争利益声明:发表后联系作者,要求发表利益声明。2. 自 适 应 恢 复 数 据 压 缩 。 [ 《 阵 列 》 第 12 卷 , 2021 , 100076 ,https://doi.org/10.1016/j.array.2021.100076.竞争利益声明:发表后联系作者,要求发表利益声明。3. “使用深度学习技术和基于遗传的特征提取来缓解演示攻击”。[《阵列》第7卷,2020年,100029]https://doi.org/10.1016/j.array.2020.100029。竞争利益声明:发表后联系作者,要求发表利益声明。4. “基于混合优化算法的协作认知无线电网络资源优化分配”. [Array,Volume12,2021,100093https://doi

动态规划与最大子数组和问题:如何高效解决序列中的最大子数组和

## 1. 引言 ### 1.1 背景介绍 动态规划是一种解决复杂问题的算法设计方法,它通过将问题分解成子问题,并解决每个子问题,从而逐步构建最优解。在计算机科学和算法领域,动态规划被广泛应用于优化问题的求解。 ### 1.2 动态规划在算法中的重要性 动态规划不仅仅是一种算法,更是一种解决问题的思维方式。它通过保存子问题的解,避免了重复计算,从而在时间和空间上实现了效率的提升。这种思想在很多经典算法问题中都发挥着关键作用,其中之一便是最大子数组和问题。 ### 1.3 最大子数组和问题的实际应用场景 最大子数组和问题是在一个数组中找到一个具有最大和的连续子数组的问题。这个问题在实际中有

def charlist(): li=[] for i in range('A','Z'+1): li.append(i) return li

这段代码有误,因为 `range()` 函数的第一个参数应该是整数类型而不是字符串类型,应该改为 `range(ord('A'), ord('Z')+1)`。同时,还需要将 `ord()` 函数得到的整数转化为字符类型,可以使用 `chr()` 函数来完成。修改后的代码如下: ``` def charlist(): li = [] for i in range(ord('A'), ord('Z')+1): li.append(chr(i)) return li ``` 这个函数的作用是返回一个包含大写字母 A 到 Z 的列表。

本科毕设论文-—基于单片机控制“航标灯”的控制系统设计与调试.doc

本科毕设论文-—基于单片机控制“航标灯”的控制系统设计与调试.doc

动态多智能体控制的贝叶斯优化模型及其在解决复杂任务中的应用

阵列15(2022)100218空间导航放大图片创作者:John A. 黄a,b,1,张克臣c,Kevin M. 放大图片作者:Joseph D. 摩纳哥ca约翰霍普金斯大学应用物理实验室,劳雷尔,20723,MD,美国bKavli Neuroscience Discovery Institute,Johns Hopkins University,Baltimore,21218,VA,USAc约翰霍普金斯大学医学院生物医学工程系,巴尔的摩,21205,MD,美国A R T I C L E I N F O保留字:贝叶斯优化多智能体控制Swarming动力系统模型UMAPA B S T R A C T用于控制多智能体群的动态系统模型已经证明了在弹性、分散式导航算法方面的进展。我们之前介绍了NeuroSwarms控制器,其中基于代理的交互通过类比神经网络交互来建模,包括吸引子动力学 和相位同步,这已经被理论化为在导航啮齿动物的海马位置细胞回路中操作。这种复杂性排除了通常使用的稳定性、可控性和性能的线性分析来研究传统的蜂群模型此外�

动态规划入门:如何有效地识别问题并构建状态转移方程?

### I. 引言 #### A. 背景介绍 动态规划是计算机科学中一种重要的算法思想,广泛应用于解决优化问题。与贪婪算法、分治法等不同,动态规划通过解决子问题的方式来逐步求解原问题,充分利用了子问题的重叠性质,从而提高了算法效率。 #### B. 动态规划在计算机科学中的重要性 动态规划不仅仅是一种算法,更是一种设计思想。它在解决最短路径、最长公共子序列、背包问题等方面展现了强大的能力。本文将深入介绍动态规划的基本概念、关键步骤,并通过实例演练来帮助读者更好地理解和运用这一算法思想。 --- ### II. 动态规划概述 #### A. 什么是动态规划? 动态规划是一种将原问题拆解