如何通过Java代码实现KMP算法

 更新时间:2019年11月14日 10:59:27   作者:loytime  
这篇文章主要介绍了如何通过Java代码实现KMP算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

这篇文章主要介绍了如何通过Java代码实现KMP算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为克努特——莫里斯——普拉特操作(简称KMP算法)。KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是实现一个next()函数, 

函数本身包含了模式串的局部匹配信息。时间复杂度O(m+n)。

代码如下

import java.util.Arrays;
 
public class Test {
 
  /**
   * @param str 文本串
   * @param dest 模式串
   * @param next 匹配核心数组
   * @return
   */
  public static int kmp(String str, String dest,int[] next) {
    for(int i = 0, j = 0; i < str.length(); i++){
      if (j > 0 && str.charAt(i) != dest.charAt(j)) {
        j = next[j - 1];
      }
      if (str.charAt(i) == dest.charAt(j)) {
        j++;
      }
      if (j == dest.length()) {
        return i-j+1;
      }
    }
    return 0;
  }
 
  public static int[] kmpnext(String dest) {
    int[] next = new int[dest.length()];
    next[0] = 0;
    for(int i = 1,j = 0; i < dest.length(); i++) {
      if (j > 0 && dest.charAt(j) != dest.charAt(i)) {
        j = next[j - 1];
      }
      if (dest.charAt(i) == dest.charAt(j)) {
        j++;
      }
      next[i] = j;
    }
    return next;
  }
 
  public static void main(String[] args){
    String a = "ABABAE";
    String b = "ABABABABAEBEABADAEABAEABABAE";
    int[] next = kmpnext(a);
    System.out.println(Arrays.toString(next));
    int res = kmp(b, a,next);
    System.out.println(res);
  }
 
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • AsyncConfigurerSupport自定义异步线程池处理异常

    AsyncConfigurerSupport自定义异步线程池处理异常

    这篇文章主要为大家介绍了AsyncConfigurerSupport自定义异步线程池处理异常详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • java树结构stream工具类的示例代码详解

    java树结构stream工具类的示例代码详解

    Stream 作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念。今天通过本文重点给大家介绍java树结构stream工具类的示例代码,感兴趣的朋友一起看看吧
    2022-03-03
  • Spring中的@ResponseStatus使用

    Spring中的@ResponseStatus使用

    这篇文章主要介绍了Spring中的@ResponseStatus使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • SpringBoot整合Swagger2代码实例

    SpringBoot整合Swagger2代码实例

    这篇文章主要介绍了SpringBoot整合Swagger2代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • SpringBoot整合Apache Pulsar教程示例

    SpringBoot整合Apache Pulsar教程示例

    这篇文章主要为大家介绍了SpringBoot整合Apache Pulsar教程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • Java中文件写入内容的几种常见方法

    Java中文件写入内容的几种常见方法

    本文主要介绍了Java中文件写入内容的几种常见方法,主要包括使用NIO的Files工具类、通过commons-io的FileUtils工具类、RandomAccessFile、PrintWriter和BufferedWriter这几种,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • java安全停止线程的方法详解

    java安全停止线程的方法详解

    这篇文章主要介绍了java安全停止线程的方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • IntelliJ IDEA下Maven创建Scala项目的方法步骤

    IntelliJ IDEA下Maven创建Scala项目的方法步骤

    这篇文章主要介绍了IntelliJ IDEA下Maven创建Scala项目的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • java 微信随机红包算法代码实例

    java 微信随机红包算法代码实例

    这篇文章主要介绍了java 微信随机红包算法的相关资料,并附实例代码,需要的朋友可以参考下
    2016-10-10
  • Java 实战项目之在线点餐系统的实现流程

    Java 实战项目之在线点餐系统的实现流程

    读万卷书不如行万里路,只学书上的理论是远远不够的,只有在实战中才能获得能力的提升,本篇文章手把手带你用java+SSM+jsp+mysql+maven实现一个在线点餐系统,大家可以在过程中查缺补漏,提升水平
    2021-11-11

最新评论