【KMP】【判断是否是重复子字符串】Leetcode 459 重复的子字符串

2023-12-17 06:12

本文主要是介绍【KMP】【判断是否是重复子字符串】Leetcode 459 重复的子字符串,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【KMP】【判断是否是重复子字符串】Leetcode 459 重复的子字符串

    • 解法1 拼接字符串-掐头去尾后判断是否含有原字符串
    • 解法2 KMP——重复子串的最小单位是这个字符串里的最长相等前后缀所不包含的子串
    • 解法3 暴力解法
      • KMP

---------------🎈🎈题目链接🎈🎈-------------------

在这里插入图片描述


解法1 拼接字符串-掐头去尾后判断是否含有原字符串

判断字符串s是否由重复子串组成,只要两个s拼接在一起,里面还出现一个s的话,就说明是由重复子串组成。
注意:要除去 s + s 的首字符和尾字符,这样避免在s+s中搜索出原来的s。

时间复杂度O(M+N) 调用contains方法时间复杂度
空间复杂度O(1)

class Solution {public boolean repeatedSubstringPattern(String s) {if(s.length() == 1) return false;String ss = s+s;if(ss.substring(1,ss.length()-1).contains(s)) return true;return false;}
} 

解法2 KMP——重复子串的最小单位是这个字符串里的最长相等前后缀所不包含的子串

如果这个字符串s是由重复子串组成的,
那么
重复子串的最小单位就是这个字符串里的最长相等前后缀 所不包含的子串组成的
在这里插入图片描述

时间复杂度O(N)
空间复杂度O(N)

class Solution {public boolean repeatedSubstringPattern(String s) {if(s.length() == 1) return false;int[] next = new int[s.length()];getNext(next,s);// 如果next表的最后一个值大于零 且 s的长度可以被 s的长度-next表的最后一个值 整除 则return trueif(next[s.length()-1]>0 && (s.length() % (s.length() -next[s.length()-1])==0)) {return true;}else{return false;}}// 获取next数组public void getNext(int[] next, String s){int i = 0; //前缀末尾 也等于包含i的之前字符串的最长相等前后缀长度int j = 1; //后缀末尾next[0] = 0;for(; j<s.length(); j++){while(i > 0 && s.charAt(i) != s.charAt(j)){ //如果不相同,那么前缀i就回退到next[i-1]i = next[i-1];}if(s.charAt(i) == s.charAt(j)){ // 如果相同 那么前缀i就++i++;}// 更新next数组next[j] = i;}}
}

解法3 暴力解法

时间复杂度:O(n^2),其中 n 为字符串 s 的长度。
空间复杂度:O(1)。

class Solution {public boolean repeatedSubstringPattern(String s) {// 暴力做法 外层循环子串的结束位置 内层左匹配for(int i = 0; i<s.length()/2; i++){if(s.length() % (i+1) ==0){int count = s.length() /(i+1);int j = 1;for(; j < count; j++){System.out.println(s.substring(0, i+1));System.out.println(s.substring((i+1)*j, (i+1) * (j+1)));if(!s.substring(0, i+1).equals(s.substring((i+1)*j, (i+1) * (j+1)))) break;}if(j==count) return true;} }return false;}
}



KMP

在这里插入图片描述

这篇关于【KMP】【判断是否是重复子字符串】Leetcode 459 重复的子字符串的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/503358

相关文章

利用c++判断水仙花数并输出示例代码

《利用c++判断水仙花数并输出示例代码》水仙花数是指一个三位数,其各位数字的立方和恰好等于该数本身,:本文主要介绍利用c++判断水仙花数并输出的相关资料,文中通过代码介绍的非常详细,需要的朋友可以... 以下是使用C++实现的相同逻辑代码:#include <IOStream>#include <vec

Python字符串处理方法超全攻略

《Python字符串处理方法超全攻略》字符串可以看作多个字符的按照先后顺序组合,相当于就是序列结构,意味着可以对它进行遍历、切片,:本文主要介绍Python字符串处理方法的相关资料,文中通过代码介... 目录一、基础知识:字符串的“不可变”特性与创建方式二、常用操作:80%场景的“万能工具箱”三、格式化方法

浅析python如何去掉字符串中最后一个字符

《浅析python如何去掉字符串中最后一个字符》在Python中,字符串是不可变对象,因此无法直接修改原字符串,但可以通过生成新字符串的方式去掉最后一个字符,本文整理了三种高效方法,希望对大家有所帮助... 目录方法1:切片操作(最推荐)方法2:长度计算索引方法3:拼接剩余字符(不推荐,仅作演示)关键注意事

自定义注解SpringBoot防重复提交AOP方法详解

《自定义注解SpringBoot防重复提交AOP方法详解》该文章描述了一个防止重复提交的流程,通过HttpServletRequest对象获取请求信息,生成唯一标识,使用Redis分布式锁判断请求是否... 目录防重复提交流程引入依赖properties配置自定义注解切面Redis工具类controller

Java实现字符串大小写转换的常用方法

《Java实现字符串大小写转换的常用方法》在Java中,字符串大小写转换是文本处理的核心操作之一,Java提供了多种灵活的方式来实现大小写转换,适用于不同场景和需求,本文将全面解析大小写转换的各种方法... 目录前言核心转换方法1.String类的基础方法2. 考虑区域设置的转换3. 字符级别的转换高级转换

MySQL字符串转数值的方法全解析

《MySQL字符串转数值的方法全解析》在MySQL开发中,字符串与数值的转换是高频操作,本文从隐式转换原理、显式转换方法、典型场景案例、风险防控四个维度系统梳理,助您精准掌握这一核心技能,需要的朋友可... 目录一、隐式转换:自动但需警惕的&ld编程quo;双刃剑”二、显式转换:三大核心方法详解三、典型场景

Java中的随机数生成案例从范围字符串到动态区间应用

《Java中的随机数生成案例从范围字符串到动态区间应用》本文介绍了在Java中生成随机数的多种方法,并通过两个案例解析如何根据业务需求生成特定范围的随机数,本文通过两个实际案例详细介绍如何在java中... 目录Java中的随机数生成:从范围字符串到动态区间应用引言目录1. Java中的随机数生成基础基本随

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

java中判断json key是否存在的几种方法

《java中判断jsonkey是否存在的几种方法》在使用Java处理JSON数据时,如何判断某一个key是否存在?本文就来介绍三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目http://www.chinasem.cn录第一种方法是使用 jsONObject 的 has 方法

Python 常用数据类型详解之字符串、列表、字典操作方法

《Python常用数据类型详解之字符串、列表、字典操作方法》在Python中,字符串、列表和字典是最常用的数据类型,它们在数据处理、程序设计和算法实现中扮演着重要角色,接下来通过本文给大家介绍这三种... 目录一、字符串(String)(一)创建字符串(二)字符串操作1. 字符串连接2. 字符串重复3. 字