459. 重复的子字符串

459. 重复的子字符串

  • 原题链接:
  • 完成情况:
  • 解题思路:
  • 参考代码:
    • __459重复的子字符串_枚举
    • __459重复的子字符串_字符串匹配
    • __459重复的子字符串_KMP算法
    • __459重复的子字符串_优化的KMP算法
  • 错误经验吸取

原题链接:

459. 重复的子字符串

https://leetcode.cn/problems/repeated-substring-pattern/submissions/

完成情况:

在这里插入图片描述

解题思路:

思路与算法如果一个长度为 nnn 的字符串 sss 可以由它的一个长度为 n′n'n 
′的子串 s′s's 
′重复多次构成,那么:nnn 一定是 n′n'n 
′的倍数;s′s's 
′一定是 sss 的前缀;对于任意的 i∈[n′,n)i \in [n', n)i∈[n 
′,n),有 s[i]=s[i−n′]s[i] = s[i-n']s[i]=s[i−n 
′]。也就是说,sss 中长度为 n′n'n 
′的前缀就是 s′s's 
′,并且在这之后的每一个位置上的字符 s[i]s[i]s[i],都需要与它之前的第 n′n'n 
′个字符 s[i−n′]s[i-n']s[i−n 
′] 相同。因此,我们可以从小到大枚举 n′n'n 
′,并对字符串 sss 进行遍历,进行上述的判断。注意到一个小优化是,因为子串至少需要重复一次,所以 n′n'n 
′不会大于 nnn 的一半,我们只需要在 [1,n2][1, \frac{n}{2}][1, 
2
n
​] 的范围内枚举 n′n'n 
′即可。

参考代码:

__459重复的子字符串_枚举

package 代码随想录.字符串;public class __459重复的子字符串_枚举 {//给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。/**方法一: 双重for循环,其中一个for循环,用i,j记录起始,截止位置;;另一个for循环,用于剩余的j到结尾。*/public boolean repeatedSubstringPattern(String s) {/*提示:1 <= s.length <= 104s 由小写英文字母组成解法1:调用KMP算法/暴力for循环?,将一个部分,分成从[0,i]和[i+1,s.length-1]的两个子串。*/int n = s.length();for (int i = 1;i*2 <= n;i++){   //要能够匹配,最多只能遍历一般即可。if (n % i == 0){    //把i作为匹配对象boolean match = true;for (int j = i;j < n;j++){     //j是匹配位置if (s.charAt(j)!= s.charAt(j-i)){   //同步j-i位置。【i为配对对象】match = false;break;}}if (match){return true;}}}return false;}
}

__459重复的子字符串_字符串匹配

package 代码随想录.字符串;public class __459重复的子字符串_字符串匹配 {/*** 调用方法进行配对** @param s* @return*/public boolean repeatedSubstringPattern(String s){return (s+s).indexOf(s,1) != s.length();}
}

__459重复的子字符串_KMP算法

package 代码随想录.字符串;import java.util.Arrays;public class __459重复的子字符串_KMP算法 {public boolean repeatedSubstringPattern(String s) {//确定一个固定的长度的字符串,去kmp配对另一个相同长度的字符串。return myKMP(s+s,s);    //这道题的原本是判别s是否是由某组字符重复构成}/**** @param query* @param pattern* @return*/private boolean myKMP(String query, String pattern) {int n = query.length();int m = pattern.length();int  [] fail = new int[m];Arrays.fill(fail,-1);for (int i = 1;i<m;i++){int j = fail[i-1];while (j != -1 && pattern.charAt(j+1)!= pattern.charAt(i)){j = fail[j];}if (pattern.charAt(j+1) == pattern.charAt(i)){fail[i] = j +1;}}int match = -1;for (int i = 1;i<n-1;i++){while (match != -1 && pattern.charAt(match + 1) != query.charAt(i)){match = fail[match];}if (pattern.charAt(match + 1) == query.charAt(i)){match++;if (match == m-1){return true;}}}return false;}
}

__459重复的子字符串_优化的KMP算法

package 代码随想录.字符串;import java.util.Arrays;public class __459重复的子字符串_优化的KMP算法 {public boolean repeatedSubstringPattern(String s) {//确定一个固定的长度的字符串,去kmp配对另一个相同长度的字符串。return myKMP(s);    //这道题的原本是判别s是否是由某组字符重复构成}/**** @param pattern* @return*/private boolean myKMP(String pattern) {int n = pattern.length();int [] fail = new int[n];Arrays.fill(fail,-1);for (int i = 1;i<n;i++) {int j = fail[i-1];while (j!= -1 && pattern.charAt(j+1)!= pattern.charAt(i)){j = fail[j];}if (pattern.charAt(j+1) == pattern.charAt(i)){fail[i] = j +1;}}return fail[n-1] != -1 && n%(n- fail[n-1] - 1) == 0 ;}}

错误经验吸取

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

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

相关文章

搭建产品帮助中心其实很简单,方法都在这了!

网站帮助中心是一个为用户提供支持和解答问题的重要资源。它不仅可以提高用户体验&#xff0c;还能减少用户问题反馈的数量。通过提供清晰、易于理解的文档和指南&#xff0c;帮助中心可以帮助用户更好地了解产品或服务&#xff0c;并解决他们在使用过程中遇到的问题。接下来我…

冯·诺依曼结构

一、约翰冯诺依曼---计算机之父 约翰冯诺依曼&#xff08;John von Neumann&#xff0c;1903年12月28日—1957年2月8日&#xff09;&#xff0c;出生于匈牙利布达佩斯&#xff0c;匈牙利裔美籍数学家、计算机科学家、物理学家和化学家&#xff0c;美国国家科学院院士&#xff…

使用 Socks5 来劫持 HTTPS(TCP-TLS) 之旅

MITM 劫持的过程中&#xff0c;HTTP 协议并不是唯一选择。 实际在 MITM 使用过程中&#xff0c;BurpSuite 和 Yakit 提供的交互式劫持工具只能劫持 HTTP 代理的 TLS 流量&#xff1b;但是这样是不够的&#xff0c;有时候我们并不能确保 HTTP 代理一定生效&#xff0c;或者说特…

HDMI之编码篇

概述 HDMI 2.0b(含)以下版本,采用3个Channel方式输出。传输又分为3三种周期,视频数据,数据岛以及控制周期。视频传输采用8/10编码。数据岛采用4/10编码(TERC4)。控制周期采用2/10。编码都拓展成了10bits。 上图中,Pixel component(e.g.B)->D[7:0]表示视频数据周期…

74hc595模块参考

74hc595模块参考 8位串行并行输出&#xff08;SIPO&#xff09;移位寄存器 使用74HC595移位寄存器扩展微控制器上的输出引脚数量。如果你需要扩充输入引脚的数量那么你需要74HC165移位寄存器。 SER&#xff08;串行输入&#xff09;引脚用于一次一位地将数据发送到移位寄存器…

redux-devtools谷歌扩展插件的使用示例

目录 1. store.ts 2. reducer.ts 3. ReduxProvider.tsx 4. mapStateToProps.ts 5. mapDispatchToProps.ts 6. Todo组件(最外层包ReduxProvider 7. Todo组件里面涉及的子组件 1) TodoInput.tsx 2) TodoList.tsx 3) TodoItem.tsx 8. App组件使用Todo组件 1. store.ts …

认识继承和多态

1 继承 1.1 为什么需要继承 Java 中使用类对现实世界中实体来进行描述&#xff0c;类经过实例化之后的产物对象&#xff0c;则可以用来表示现实中的实体&#xff0c;但是现实世界错综复杂&#xff0c;事物之间可能会存在一些关联&#xff0c;那在设计程序里就需要考虑 比如&a…

No182.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

No181.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

C# ZXing 二维码,条形码生成与识别

C# ZXing 二维码条形码生成识别 安装ZXing使用ZXing生成条形码生成二维码生成带Logo的二维码识别二维码、条形码 安装ZXing NuGet搜索ZXing安装ZXing.Net包 使用ZXing using ZXing; using ZXing.Common; using ZXing.QrCode; using ZXing.QrCode.Internal; 生成条形码 //…

mybatis嵌套查询子集合只有一条数据

我们再用mybatis做嵌套查询时&#xff0c;有时会遇到子集合只有1条数据的情况&#xff0c;例如下这样&#xff1a; 数据库查询结果 xml <resultMap id"userMap" type"com.springboot.demo.test.entity.User"><id column"uid" property…

腾讯云5年服务器CVM和3年轻量应用服务器配置价格表

腾讯云3年轻量和5年云服务器CVM活动入口&#xff0c;3年轻量应用服务器配置可选2核2G4M和2核4G5M带宽&#xff0c;5年CVM云服务器可以选择2核4G和4核8G配置可选&#xff0c;阿腾云atengyun.com分享腾讯云3年轻量应用服务器和5年云服务器CVM活动入口和配置报价&#xff1a; 目录…

ubuntu16.04安装vscode遇到的code 依赖于 libnss3 (>= 2:3.30)解决

1、ubuntu16.04安装最新版本vscode失败原因 ubuntu16.04安装最新版本的vscode会遇到依赖libnss3(>2:3.30)的问题&#xff0c;原因是ubuntu16.04安装的库libnss3版本更低&#xff0c;与vscode需要的更高版本的libnss3库不兼容&#xff0c;只需要升级libnss3库版本高于2:3.30…

【多线程】

文章目录 概念一、线程的生命周期图二、线程的创建方式一方式二线程API线程优先级sleep阻塞守护线程多线程并发安全问题 总结 概念 线程:一个顺序的单一的程序执行流程就是一个线程。代码一句一句的有先后顺序的执行。多线程:多个单一顺序执行的流程并发运行。造成"感官上…

计算机msvcp140.dll重新安装的四个解决方法,专门解决dll文件丢失问题的方法

在我多年的电脑使用经历中&#xff0c;曾经遇到过一个非常棘手的问题&#xff0c;那就是电脑提示找不到msvcp140.dll文件。这个问题让我苦恼了很久&#xff0c;但最终还是找到了解决方法。今天&#xff0c;我就来分享一下我解决这个问题的四种方法&#xff0c;希望对大家有所帮…

Node.js如何处理多个请求?

前言 在计算机科学领域&#xff0c;关于并发和并行的概念经常被提及。然而&#xff0c;这两个术语常常被混为一谈&#xff0c;导致很多人对它们的理解存在着很多混淆。本文小编将通过对并发和并行的深入解析&#xff0c;帮助读者更好地理解它们之间的不同特点和应用场景。同时…

【Java 进阶篇】Java中的 JSP(JavaServer Pages)

JavaServer Pages&#xff08;JSP&#xff09;是一种用于开发动态Web页面的Java技术。它是在静态Web页面中嵌入Java代码的一种方式&#xff0c;使得开发者可以借助Java的强大功能来创建动态、交互性强的Web应用程序。在本文中&#xff0c;我们将深入探讨JSP的概念、原理和基本用…

SpringBoot项目调用openCV报错:nested exception is java.lang.UnsatisfiedLinkError

今天在通过web项目调用openCV的时候提示如下错误&#xff1a; nested exception is java.lang.UnsatisfiedLinkError:org.opencv.imgcodecs.Imgcodecs.imread_0(Ljava/la如下图所示&#xff1a; 但是通过直接启动java main函数确正常&#xff0c;初步诊断和SpringBoot热加载…

(离散数学)命题及命题的真值

答案&#xff1a; &#xff08;5&#xff09;不是命题&#xff0c;因为真值不止一个 &#xff08;6&#xff09;不是命题&#xff0c;因为不是陈述句 &#xff08;7&#xff09;不是命题&#xff0c;因为不是陈述句 &#xff08;8&#xff09;不是命题&#xff0c;真值不唯一

ElasticSearch7.x - HTTP 操作 - 查询文档操作

查询索引下的所有文档 http://192.168.254.101:9200/shopping/_search 条件查询 请求路径上添加条件:http://192.168.254.101:9200/shopping/_search?q=category:小米 请求体上添加条件:http://192.168.254.101:9200/shopping/_search 请求体内容 {"query" :{&qu…