问题描述:
判断字符串a是否包含字符串b。我们称a为文本串,b为模式串。比如
- a = bcabcabcabbcabcabcabcabd
- ||||||||||/
- b = bcabcabcabc
算法思路:
如上例中/处两个字符匹配失败,如果模式串右移一个字符从文本串第二个字符开始重新进行匹配,显然效率太低。
KMP算法的精髓在于当文本串和模式串发生不匹配时,利用模式串自身的特点,尽可能多的移动模式串,使之能够在文本串不匹配处继续进行匹配。
如上例,发生不匹配时,模式串可以右移三次,在目标串不匹配处继续进行:
- a=bcabcabcabbcabcabcabcabd
- |||||||/
- b= bcabcabcabc
算法原理:
模式串b=b1b2b3b4…bn,如果有b1b2b3b4…bk-1等于bj-(k-1)bj-(k-2)bj-(k-3)…bj-1,那么在进行匹配时,如果在j处与文本串i处匹配失败,我们可以将模式串右移j-k个字符,即直接将文本串i处字符与bk进行匹配。由于b1b2b3b4…bk-1等于bj-(k-1)bj-(k-2)bj-(k-3)…bj-1,显然模式串前k-1位的字符是与文本串i处前k-1位字符是匹配的。
所以问题转化为求模式串各字符的k值,我们记作K(j),该值可以根据模式串自身求得。
伪代码:
假设有文本串a和模式串b。index从1开始。
求K(j)的伪代码如下:
- 初始化:i = 1,j = 0, K(1) = 0;
- while (i < b.length) {
- if (j == 0 || b(i) = b(j)) {
- i++;
- j++;
- K(i) = j;
- } else {
- j = K(j);
- }
- }
判断匹配的伪代码如下:
- 初始化:i = 1, j = 1;
- while (i <= a.length && j <= b.length) {
- if (j ==0 || a(i)= b(j)) {
- i++;
- j++;
- } else {
- j = K(j);
- }
- }
- if (j > b.length) {
- return true;
- }
- return false;
Java实现:
- package cn.dfeng;
- /**
- * KMP算法的实现
- * @author dfeng
- *
- */
- public class KMPAlgorithm {
- /**
- * 判断是否匹配
- * @param target 目标文本串
- * @param mode 模式串
- * @return 匹配结果
- */
- public static boolean matchString(String target, String mode) {
- //为了和算法保持一致,使index从1开始,增加一前缀
- String newTarget = "x" + target;
- String newMode = 'x' + mode;
- int[] K = calculateK(mode);
- int i = 1;
- int j = 1;
- while(i <= target.length() && j <= mode.length()) {
- if (j == 0 || newTarget.charAt(i) == newMode.charAt(j)) {
- i++;
- j++;
- } else {
- j = K[j];
- }
- }
- if (j > mode.length()) {
- return true;
- }
- return false;
- }
- /*
- * 计算K值
- */
- private static int[] calculateK(String mode) {
- //为了和算法保持一致,使index从1开始,增加一前缀
- String newMode = "x" + mode;
- int[] K = new int[newMode.length()];
- int i = 1;
- K[1] = 0;
- int j = 0;
- while(i < mode.length()) {
- if (j == 0 || newMode.charAt(i) == newMode.charAt(j)){
- i++;
- j++;
- K[i] = j;
- } else {
- j = K[j];
- }
- }
- return K;
- }
- /**
- * @param args
- */
- public static void main(String[] args) {
- String a = "bcabcabcabbcabcabcabcab";
- String b = "bcabcabcabc";//"ababbaaba";//
- System.out.println(KMPAlgorithm.matchString(a, b));
- }
- }
相关推荐
总结来说,KMP算法是一种高效的字符串匹配方法,它通过部分匹配表避免了不必要的回溯,提高了匹配效率。"DemoZwb"压缩包文件提供了一个实际的KMP算法实现,通过运行和分析这个程序,你可以进一步加深对KMP算法的理解...
这是个比较难理解的算法,虽然代码就那么几行,但真正理解清楚还是要会时间的。
《KMP算法详解——高效字符串匹配的秘密》 在信息技术领域,字符串处理是极其常见的操作,尤其是在文本分析、数据挖掘和模式识别中。其中,字符串匹配是核心问题之一,而KMP(Knuth-Morris-Pratt)算法正是解决这一...
字符串查找是计算机科学中一个基础且重要的问题,特别是在文本处理、模式匹配和数据搜索等领域...在实际编程中,可以使用各种编程语言实现KMP算法,例如C++、Java、Python等,通过调试和优化,可以进一步提高算法性能。
KMP算法实现,用Java语言实现的KMP字符串匹配算法
《KMP算法与Java实现详解》 在计算机科学中,字符串搜索算法是处理文本和数据的重要工具,其中KMP(Knuth-Morris-Pratt)算法因其高效性和实用性而备受青睐。KMP算法是由Donald Knuth、Vaughan Pratt和James H. ...
本文档为使用Java代码实现了: 1.朴素的字符串匹配算法; 2.KMP字符串模式匹配算法 详细说明请参见博客: http://blog.csdn.net/lemon_tree12138/article/details/48488813
Java实现的KMP(Knuth-Morris-Pratt)...综上所述,Java实现的KMP算法是一种优化的字符串匹配算法,通过部分匹配表减少不必要的比较,提高了搜索效率。理解并掌握这一算法对于解决涉及到字符串匹配的问题非常有帮助。
KMP算法是一种改进的字符串匹配算法,由D.E.Knuth、J.H.Morris和V.R.Pratt三位学者提出,因此也被称为克努特-莫里斯-普拉特操作(简称KMP算法)。以下是对KMP算法的详细介绍: 一、算法基础与目的 KMP算法是基于...
通过理解KMP算法的工作原理,开发者可以优化字符串操作,提高程序执行效率。 在学习KMP算法时,除了理论知识外,还需要通过编写代码来加深理解。例如,可以设计一个函数,接收主串和子串作为输入,返回子串在主串中...
Java KMP算法是一种高效的字符串匹配算法,主要用于在主串(目标字符串)中查找子串(模式字符串)的位置。它的全称是Knuth-Morris-Pratt算法,由D.M. Knuth、V. Morris和J.H. Pratt在1970年代提出。KMP算法避免了...
KMP算法,全称Knuth-Morris-Pratt字符串搜索算法,是一种线性时间复杂度的字符串匹配算法。它的主要思想是在发生不匹配时,能知道部分已经匹配的字符序列的后缀和模式串的前缀存在重复,因此可以利用这些信息避免...
KMP(Knuth-Morris-Pratt)算法是...总的来说,KMP算法提供了一种高效的字符串匹配方法,通过部分匹配表优化了搜索过程,减少了比较次数。在Java中实现KMP算法,需要理解其核心思想,并熟练运用这部分知识来编写代码。
总结,KMP算法是一种高效的字符串搜索算法,其Java实现主要涉及部分匹配表的构建和基于此表的字符串匹配过程。在实际编程中,理解和熟练掌握KMP算法能够帮助我们解决许多字符串相关的问题,提高程序性能。
在本资源中,我们重点关注的是字符串匹配算法——KMP(Knuth-Morris-Pratt)算法,这是一种用于在主串中寻找子串的高效算法,尤其适用于大数据集。在2023年的考研中,这样的算法可能会是考察的重点,因为它体现了对...
在实际编程实现中,KMP算法通常用C++、Java、Python等编程语言实现,通过对字符串进行迭代和条件判断,结合部分匹配表来完成高效的模式匹配。在本压缩包文件中,可能包含了用某种编程语言封装好的KMP算法实现,可供...
KMP算法的Java实现 public class KMP { public static int[] next; static void GetNext(String p,int next[]) { int pLen = p.length(); next[0] = -1;
相较于朴素的字符串匹配方法,KMP算法能够有效地避免不必要的比较操作,从而显著提高搜索速度。 #### 二、KMP算法原理 在深入探讨Java实现细节之前,我们先来了解一下KMP算法的基本原理: 1. **前缀表(next 数组)...
KMP算法通过构建next数组避免了模式串不必要的回溯,提高了字符串匹配的效率。在Java中,我们可以利用类`KMP`实现该算法,通过预处理next数组并用它来指导匹配过程。在实际应用中,KMP算法常用于大量字符串的搜索和...
在IT领域,字符串处理是常见的任务之一,而KMP(Knuth-Morris-Pratt)算法则是一种高效处理字符串匹配问题的算法。本主题聚焦于如何利用KMP算法实现字符的替换操作,这对于文本处理、数据清洗、信息检索等多个方面都...