【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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/228077.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++11特性篇】一文助小白轻松理解 C++中的【左值&左值引用】【右值&右值引用】

前言 大家好吖&#xff0c;欢迎来到 YY 滴C系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; 目录 一.【左值&#xff06;左值引用】&…

C#中简单的继承和多态

今天我们来聊一聊继承&#xff0c;说实话今天也是我第一次接触。 继承的概念是什么呢&#xff1f;就是一个类可以继承另一个类的属性和方法&#xff08;成员&#xff09; 继承是面向对象编程中的一个非常重要的特性。 好了&#xff0c;废话不多说&#xff0c;下面切入正题&a…

微信小程序使用camera扫码获取相机权限

确保用户隐私指引已经明确使用相机功能 “mp-weixin”: "permission": {"scope.camera": {"desc": "需要使用相机功能&#xff0c;请授权"}}wx.authorize({scope: scope.camera,success(res) {console.log(res, 用户成功授权)// 用户…

C语言实现Hoare版快速排序(递归版)

Hoare版 快速排序是由Hoare发明的&#xff0c;所以我们先来讲创始人的想法。我们直接切入主题&#xff0c;Hoare版快速排序的思想是将一个值设定为key&#xff0c;这个值不一定是第一个&#xff0c;如果你选其它的值作为你的key&#xff0c;那么你的思路也就要转换一下&#xf…

Mysql(事务)

Mysql&#xff08;事务&#xff09; 简介 是什么&#xff1a;一组操作的集合&#xff0c;不分割的工作单位&#xff0c;事务会把所有的操作作为一个整体&#xff0c;向数据库发起操作&#xff0c;要么全部失败要么全部成功。 案例&#xff1a; 银行转账 查询A的余额减少的A的余…

input , change ,blur 事件的区别,以及在vue和react中的表现

原生事件介绍 onInput Event 当一个 , , 或 元素的 value 被修改时&#xff0c;会触发 input 事件 onChange Event 当用户更改 、 和 元素的值时&#xff0c;change 事件在这些元素上触发。和 input 事件不同的是&#xff0c;并不是每次元素的 value 改变时都会触发 change…

SQL 算术运算符

SQL Server中的存储过程 什么是存储过程&#xff1f; 存储过程是一段预先编写好的 SQL 代码&#xff0c;可以保存在数据库中以供反复使用。它允许将一系列 SQL 语句组合成一个逻辑单元&#xff0c;并为其分配一个名称&#xff0c;以便在需要时调用执行。存储过程可以接受参数…

Qt线程池

创建一个类继承自QRunnable&#xff1a; class Thread02 : public QRunnable 重写run方法&#xff1a; void run() override; 在main函数里面加入线程池&#xff1a; Thread02 *th new Thread02();QThreadPool::globalInstance()->start(th); #include <QtCore/QC…

巧妙的使用WPF中的资源

其实&#xff0c;在wpf中&#xff0c;最核心的就是xaml&#xff0c;因为只有xaml&#xff0c;才能体现出用的是wpf&#xff0c;而不是普通的cs文件&#xff0c;cs文件在winform中等等程序都可以使用的&#xff0c;唯独xaml才是wpf中最重要的&#xff0c;最精华的东西&#xff0…

ARM按键中断

do_irq.c 判断中断号 #include "key_it.h" extern void printf(const char *fmt, ...); unsigned int i 0; void do_irq(void) {// 获取中断号&#xff0c;根据中断号的不同进行不同的中断处理int irqno;irqno GICC->IAR & 0x3ff;switch (irqno){case 99:…

gitlab ci pages

参考文章 gitlab pages是什么 一个可以利用gitlab的域名和项目部署自己静态网站的机制 开启 到gitlab的如下页面 通过gitlab.ci部署项目的静态网站 # build ruby 1/3: # stage: build # script: # - echo "ruby1"# build ruby 2/3: # stage: build …

jupyter notebook介绍、安装和使用

简介 Jupyter Notebook是基于网页的用于交互计算的应用程序。其可被应用于全过程计算&#xff1a;开发、文档编写、运行代码和展示结果。——Jupyter Notebook官方介绍 简而言之&#xff0c;Jupyter Notebook是以网页的形式打开&#xff0c;可以在网页页面中直接编写代码和运…

vue3 + ts 判断各种数据类型,首字母转大写,下划转驼峰,的方法集合

vue3 ts 判断各种数据类型&#xff0c;首字母转大写&#xff0c;下划转驼峰&#xff0c;的方法集合(记录ing…) 1. 直接上代码 1. 在utils文件夹下新建 index.ts// index.ts/*** description: 判断是否为某个类型*/ export function is(val: unknown, type: string) {return …

SpringCache入门

1. SpringCache概述 Spring Cache 是 Spring 框架提供的一个用于提高应用性能的缓存抽象。它不是一个具体的缓存实现&#xff0c;而是提供了一组一致的编程模型来整合各种缓存机制&#xff0c;比如 EhCache、Caffeine、Redis 等。Spring Cache 使得开发者可以通过简单的注解来…

Spring Boot+Mybatis设置sql日志打印

在全局配置文件添加以下内容&#xff1a;logging.level.com.demo.mapperdebug&#xff0c;com.demo.mapper&#xff1a;src下的mapper路径&#xff0c;debug&#xff1a;设置日志打印级别为debug&#xff0c;亦可设置为&#xff1a;ERROR、WARN、INFO application.properties …

10-流媒体-RTMP编译

将h264推流给服务器&#xff0c;就完成了采集端的推流工作。一般在嵌入式系统常用的rtmp推流方案是rtmpdump。使用rtmp库涉及到一些编译过程&#xff0c;下面我们一点点描述。 关于rtmp的使用涉及到3个开源库的编译&#xff08;openssl, zlib, rtmpdump&#xff09;&#xff0c…

【C++】optional的使用(一)

这篇文章介绍下C17引入的std::optional 为什么要有 optional 一般来说&#xff0c;如果想要一个函数返回“多个”值&#xff0c;C程序员倾向于使用结构体/类完成这个操作。即定义一个通用的结构体&#xff0c;在函数内部完成装填&#xff0c;然后返回一个实例化的结构体。 #…

fckeditor编辑器改造示例:增加PRE,CODE控件

查看专栏目录 Network 灰鸽宝典专栏主要关注服务器的配置&#xff0c;前后端开发环境的配置&#xff0c;编辑器的配置&#xff0c;网络服务的配置&#xff0c;网络命令的应用与配置&#xff0c;windows常见问题的解决等。 文章目录 修改方法&#xff1a;1&#xff09;修改fckco…

Python项目——贪吃蛇

1、原理 整个界面由一个二维数组组成。游戏开始时&#xff0c;会随机生成一个苹果&#xff08;红点&#xff09;和一条蛇&#xff08;黄点&#xff09;。蛇会在二维数组中移动&#xff0c;当蛇碰到苹果时&#xff0c;苹果被吃&#xff0c;蛇的长度加一&#xff08;红点变黄点&…

性能测试

什么是性能测试&#xff1f;性能测试定义性能测试和功能测试区别性能测试常见术语及指标1&#xff1a;用户数3&#xff1a;响应时间4&#xff1a;事务5&#xff1a;每秒事务通过数6&#xff1a;用户点击率7&#xff1a;吞吐量8&#xff1a;吞吐率9&#xff1a;思考时间10&#…