当前位置: 首页 > article >正文

java实现一个kmp算法

1、什么是KMP算法

      Kmp 算法是由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,改进字符串匹配的算法;

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

      快速匹配的目的;

      Kmp 算法的时间复杂度是O(m+n),m=模式串的长度,n=主字符串的长度

2、示例代码

/**
 * Kmp算法练习1:
 * 1、什么是Kmp算法?
 * Kmp 算法是由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,改进字符串匹配的算法;
 * Kmp 算法的核心是利用匹配失败的信息,尽量减少模式串与主串的匹配次数,以达到快速匹配的目的;
 * Kmp 算法的时间复杂度是O(m+n),m=模式串的长度,n=主字符串的长度
 *
 *
 */
public class KMPDemo01 {

    /**
     *
     * @param str 主字符串
     * @param p  要查找的字符串,即模式串
     * @return
     */
    public int kmp(String str,String p){
        if(str == null || "".equals(str.trim()) || p == null || "".equals(p.trim())){
            return -1;
        }
        int[] next = new int[p.length()];
        int i=0,j=0;
        /**
         * 1、计算模式串的next数组
         */
        next(next,p);

        /**
         * 匹配过程
         */
        while (i<str.length() && j<p.length()){
            //当主字符串与模式串的字符匹配时,主字符串坐标i和模式字符串坐标j同时增加
            //否则,模式字符串坐标j回溯
            if(j == -1 || str.charAt(i) == p.charAt(j)){
                i++;
                j++;
            }else {
                /**
                 * j 回退,返回上一个满足条件的位置
                 */
                j = next[j];
            }
        }
        if((i - p.length()) >= 0){
            return i - p.length();
        }
        return -1;
    }

    /**
     * next数组的计算
     * 数组 next 保存每次遇到字符不一样的上一个的位置
     * 对于模式串p的每个位置j,next[j]表示p[0,j-1]的最长相等前后缀子串的长度
     *
     * @param next
     * @param p
     */
    private void next(int[] next,String p){

        int j = 0;
        int k = -1;
        next[0] = -1;
        while (j< p.length() - 1){
            if(k == -1 || p.charAt(k) == p.charAt(j)){
                k++;
                j++;
                if(p.indexOf(k) == p.indexOf(j)){
                    next[j] = next[k];
                }else {
                    next[j] = k;
                }
            }else {
                /**
                 * k回退,获取上一步的k
                 */
                k = next[k];
            }
        }
    }

    public static void main(String[] args) {
        KMPDemo01 kmp = new KMPDemo01();
        String str = "12324abc567";
        String p = "ab";
        int index = kmp.kmp(str,p);
        System.out.println(" ****** index ****** "+index);
    }


}


http://www.kler.cn/a/462990.html

相关文章:

  • 啥是大模型
  • xdoj ROT13加密
  • 供需平台信息发布付费查看小程序系统开发方案
  • JVM实战—8.如何分析jstat统计来定位GC
  • redis的集群模式与ELK基础
  • CentOS Stream 9 安装 JDK
  • 路由算法之RIP、OSPF、BGP( The Ruting Agorithm of RIP OSPF BGP)
  • 小程序租赁系统开发的优势与应用探索
  • canvas+fabric实现时间刻度尺(二)
  • 集合(List、Set、Map)ArrayList、LinkedList、Vector、HashSet、LinkedHashSet、HashMap
  • [JAVA]MyLogger
  • 音视频入门基础:MPEG2-PS专题(4)——FFmpeg源码中,判断某文件是否为PS文件的实现
  • Web安全 - 使用 Nginx + Lua 防御 NoSQL 注入攻击
  • 【TensorFlow】Keras介绍与入门
  • redis zset底层实现
  • react相关报错--持续更新中
  • Android studio 将项目打包apk
  • 新年算法题:矩阵对称性检测
  • Linux 内核学习(3) --- 内核中断机制
  • 单片机-- 51-keil使用查看空间占用
  • C++ 设计模式:状态模式(State Pattern)
  • FristiLeaks_1.3靶场渗透
  • [羊城杯 2024]1z_misc
  • [创业之路-230]:《华为闭环战略管理》-5-华为的组织架构与业务架构是不同的,组织架构是为业务架构服务
  • Docker网络与数据卷持久化
  • 三、AI知识(自然语言处理)