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字符串查找的三种方式

    Java字符串查找的三种方式

    本篇文章给大家整理了关于Java字符串查找的三种方式,并把其中需要留意的地方做了标注,一起参考学习下。
    2018-03-03
  • Java中的ThreadPoolExecutor线程池详解

    Java中的ThreadPoolExecutor线程池详解

    这篇文章主要介绍了Java中的ThreadPoolExecutor线程池详解,当线程池中的线程数大于 corePoolSize 时,keepAliveTime 为多余的空闲线程等待新任务的最长时间,超过这个时间后多余的线程将被终止,需要的朋友可以参考下
    2023-12-12
  • Java中IO流文件读取、写入和复制的实例

    Java中IO流文件读取、写入和复制的实例

    下面小编就为大家带来一篇Java中IO流文件读取、写入和复制的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • JMeter 实现Java请求步骤及原理详解

    JMeter 实现Java请求步骤及原理详解

    这篇文章主要介绍了JMeter 实现Java请求步骤及原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • springboot整合mybatis中的问题及出现的一些问题小结

    springboot整合mybatis中的问题及出现的一些问题小结

    这篇文章主要介绍了springboot整合mybatis中的问题及出现的一些问题小结,本文给出了解决方案,需要的朋友可以参考下
    2018-11-11
  • Java中的对象流总结(必看篇)

    Java中的对象流总结(必看篇)

    下面小编就为大家带来一篇Java中的对象流总结(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • Java后端WebSocket的Tomcat实现

    Java后端WebSocket的Tomcat实现

    这篇文章主要介绍了Java后端WebSocket的Tomcat实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • MyBatis Plus之实现动态排序方式

    MyBatis Plus之实现动态排序方式

    这篇文章主要介绍了MyBatis Plus之实现动态排序方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • JWT原理与java操作jwt验证详解

    JWT原理与java操作jwt验证详解

    这篇文章主要介绍了JWT原理与java操作jwt验证,详细分析了JWT的基本概念、原理与java基于JWT进行token验证的相关操作技巧,需要的朋友可以参考下
    2023-06-06
  • 详解SpringBoot修改启动端口server.port的四种方式

    详解SpringBoot修改启动端口server.port的四种方式

    这篇文章主要介绍了详解SpringBoot修改启动端口server.port的四种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07

最新评论