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算法的资料请关注脚本之家其它相关文章!

相关文章

  • SpringBoot调用WebService接口方法示例代码

    SpringBoot调用WebService接口方法示例代码

    这篇文章主要介绍了使用SpringWebServices调用SOAP WebService接口的步骤,包括导入依赖、创建请求类和响应类、生成ObjectFactory类、配置WebServiceTemplate、调用WebService接口以及测试代码,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-02-02
  • Java实现Map集合二级联动示例

    Java实现Map集合二级联动示例

    Java实现Map集合二级联动示例,需要的朋友可以参考下
    2014-03-03
  • springboot多文件压缩实现过程

    springboot多文件压缩实现过程

    这篇文章主要介绍了springboot多文件压缩实现过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • Java通过notify和wait实现线程间的通信功能

    Java通过notify和wait实现线程间的通信功能

    在软件开发中,线程是实现并发执行的重要手段,然而,线程之间的协作与通信却是开发者必须重点考虑的挑战之一,Java作为一种广泛应用于多线程编程的语言,本文将深入探讨Java中通过notify和wait实现线程间通信的机制,需要的朋友可以参考下
    2024-06-06
  • java编程多线程并发处理实例解析

    java编程多线程并发处理实例解析

    这篇文章主要介绍了java编程多线程并发处理实例解析,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • Spring的事务管理之声明式事务详解

    Spring的事务管理之声明式事务详解

    本文介绍了Spring中的事务管理,包括声明式事务管理和和编程式事务管理,重点讲解了声明式事务管理和Spring AOP的关系,及Spring事务拦截器TransactionInterceptor的调用的,最后还释了Spring事务的创建和使用的具体过程,以及解决了一些事务相关问题
    2026-05-05
  • 案例讲解SpringBoot Starter的使用教程

    案例讲解SpringBoot Starter的使用教程

    SpringBoot中的starter是一种非常重要的机制,能够抛弃以前繁杂的配置,将其统一集成进starter,应用者只需要在maven中引入starter依赖,SpringBoot就能自动扫描到要加载的信息并启动相应的默认配置,本文通过案例讲解SpringBoot Starter的使用,感兴趣的朋友一起看看吧
    2023-12-12
  • 线程池ThreadPoolExecutor使用简介与方法实例

    线程池ThreadPoolExecutor使用简介与方法实例

    今天小编就为大家分享一篇关于线程池ThreadPoolExecutor使用简介与方法实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • Java的JDBC编程使用之连接Mysql数据库

    Java的JDBC编程使用之连接Mysql数据库

    这篇文章主要给大家介绍了关于Java的JDBC编程使用之连接Mysql数据库的相关资料,JDBC是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,需要的朋友可以参考下
    2023-12-12
  • Java代码发送post请求实现方式

    Java代码发送post请求实现方式

    本文介绍了使用Java发送POST请求的方法,包括引用工具类、设置访问地址、请求头和json请求体,最后使用工具类发送请求并返回结果
    2026-05-05

最新评论