java LeetCode题解KMP算法示例

 更新时间:2023年10月19日 08:56:25   作者:健身的墨镜  
这篇文章主要为大家介绍了java LeetCode题解KMP算法示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

KMP算法

前缀表

前缀:包含首字母,不包含尾字母的所有子串

后缀:只包含尾字母,不包含首字母的所有子串

最长相等前后缀

例如aabaaf,其最长相等前后缀如下

a 0

aa 1

aab 0

aaba 1

aabaa 2

aabaaf 0

匹配过程

在匹配过程中如果遇到不匹配,就跳到以该位置的前一位置对应的最长相等前后缀为索引的位置继续匹配

next数组

遇到冲突后回退到相应位置(即前缀表)

求next数组的过程:getnext(next,s)

初始化

前缀末尾j初始化为0,next[0]=0
i为后缀末尾
for(i=1;i<s.size();i++)

前后缀不同

连续回退过程(while):j>0 s[i]!=s[j]

这里连续回退

j=next[j-1]:要点 这种回退表示匹配不成功,那么就需要
回到记忆中已经匹配的下一位接着比较

前后缀相同

s[i]==s[j] j++

更新

next[i]=j:即记录相同位数

示例题目

459.重复的子字符串: 给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。

思路:使用KMP算法求解,这里利用到了next数组,也就是最长相等前后缀,为什么要找最长相等前后缀呢?因为在有重复子字符串的字符串中,最长相等前后缀除外的那部分,我们可以推导出是这部分组成了整个字符串,所以通过判断原字符串的长度能否整除这部分字符串的长度就可以直接判断了

public boolean repeatedSubstringPattern(String s) {
        int[] next=new int[s.length()];
        getnext(next,s);
        if(next[s.length()-1]>0){//如果为0会导致能整除从而出错
            if(s.length()%(s.length()-next[s.length()-1])==0){
                return true;
            }
        }

        return false;
    }
    public void getnext(int[] next,String s){
        int j=0;
        next[0]=0;
        for (int i = 1; i < s.length(); i++) {
            while(j>0&&s.charAt(i)!=s.charAt(j)){
                j=next[j-1];
            }
            if(s.charAt(i)==s.charAt(j)){
                j++;
            }
            next[i]=j;


        }
    }

以上就是java LeetCode题解KMP算法示例的详细内容,更多关于java KMP算法的资料请关注脚本之家其它相关文章!

相关文章

  • Java封装统一的Result Model案例

    Java封装统一的Result Model案例

    这篇文章主要介绍了Java封装统一的Result Model案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • Java数据结构-HashMap详解

    Java数据结构-HashMap详解

    这篇文章主要介绍了Java数据结构-HashMap,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • IDEA强制清除Maven缓存的实现示例

    IDEA强制清除Maven缓存的实现示例

    清除项目缓存是一个常见的操作,本文主要介绍了IDEA强制清除Maven缓存的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-07-07
  • Java线程的start方法回调run方法的操作技巧

    Java线程的start方法回调run方法的操作技巧

    面试过程中经常会被面试官问到为什么我们调用start()方法时会执行run()方法,为什么不能直接调用run()方法,问的一头雾水,今天小编给大家介绍下Java线程的start方法回调run方法的操作技巧,需要的朋友参考下吧
    2017-11-11
  • springboot中pom.xml文件注入test测试依赖时报错的解决

    springboot中pom.xml文件注入test测试依赖时报错的解决

    这篇文章主要介绍了springboot中pom.xml文件注入test测试依赖时报错的解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • MyBatis实现动态查询、模糊查询功能

    MyBatis实现动态查询、模糊查询功能

    这篇文章主要介绍了MyBatis实现动态查询、模糊查询功能,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-06-06
  • 如何使用spring-ws发布webservice服务

    如何使用spring-ws发布webservice服务

    文章介绍了如何使用Spring-WS发布Web服务,包括添加依赖、创建XSD文件、生成JAXB实体、配置Endpoint、启动服务等步骤,结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-11-11
  • 浅谈Redis在微服务架构中的几种应用场景

    浅谈Redis在微服务架构中的几种应用场景

    本文介绍在SpringCloud中使用Redis作为Pub/Sub异步通信、缓存或主数据库和配置服务器的三种场景应用。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-05-05
  • Java8方法引用及构造方法引用原理实例解析

    Java8方法引用及构造方法引用原理实例解析

    这篇文章主要介绍了Java8方法引用及构造方法引用原理实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • Java中使用异或语句实现两个变量的互换

    Java中使用异或语句实现两个变量的互换

    这篇文章主要介绍了Java中使用异或语句实现两个变量的互换,本文直接给出代码实例以及运行结果,需要的朋友可以参考下
    2015-06-06

最新评论