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.hqwc.cn/news/169386.html

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

相关文章

74hc595模块参考

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

Flutter的专属Skia引擎解析+用法原理

Skia是一款跨平台的2D图形库&#xff0c;是Google公司开发的&#xff0c;可以用于开发各种应用程序&#xff0c;如浏览器、游戏、移动应用程序等。Skia引擎的主要特点是速度快、可移植性强、占用的内存少、稳定性佳&#xff0c;适用于多种硬件平台。 Skia的目标是提供快速、高…

【Android】画面卡顿优化列表流畅度一

卡顿渲染耗时如图&#xff1a; 卡顿表现有如下几个方面&#xff1a; 网络图片渲染耗时大上下滑动反应慢&#xff0c;甚至画面不动新增一页数据加载渲染时耗时比较大&#xff0c;上下滑动几乎没有反应&#xff0c;画面停止没有交互响应 背景 实际上这套数据加载逻辑已经运行…

统计学_蒙特卡罗方法

1、蒙特卡罗方法的基本思想 蒙特卡罗方法(Monte Carlo method)是由冯诺依曼和乌拉姆等人发明的&#xff0c;“蒙特卡罗”这个名字是出自摩纳哥的蒙特卡罗赌场&#xff0c;这个方法是一类基于概率的方法的统称&#xff0c;不是特指一种方法。 蒙特卡罗方法也成统计模拟方法&am…

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

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

【STM32】TIM2的PWM:脉冲宽度调制--标准库

注意点&#xff1a; TIM_Period---->指要进行比较的值Compare TIM_Prescaler----> 指要进行分频的值【分频值/原始时钟值】 PWM是一种周期固定&#xff0c;脉宽可调整的输出波形。 https://www.cnblogs.com/brianblog/p/7117896.html 0.通用寄存器输出 1.捕获/比较通道…

Java自学第8课:电商项目(3) - 重新搭建环境

由于之前用的jdk和eclipse&#xff0c;以及mysql并不是视频教程所采用的&#xff0c;在后面运行源码和使用作者提供源码时&#xff0c;总是报错&#xff0c;怀疑&#xff1a; 1 数据库有问题 2 jdk和引入的jar包不匹配 3 其他什么未知的错误&#xff1f; 所以决定卸载jdk e…

基于Transformer架构的ChatGPT:三步带你了解它的工作原理

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 梦想从未散场&#xff0c;传奇永不落幕&#xff0c;博主会持续更新优质网络知识、Python知识、Linux知识以及各种小技巧&#xff0c;愿你我共同在CSDN进步 目录 一、Transformer架构 1. 自注意力层 2. 前馈神…

基于机器学习的 ICU 脑血管疾病死亡风险智能预测系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 Wechat / QQ 名片 :) 1. 项目简介 重症患者或重大手术后的患者在重症监护室&#xff08;ICU&#xff09;内通过多种生命支持系统以维持生理功能。患者在ICU 内会被频繁持续的记录生命体征和实验室测量等多种数据。由于高频…

vmware开启ipv6

说明 在 ipv4 基础上配置ipv6网络。 分享 大数据博客列表开发记录汇总个人java工具库 项目https://gitee.com/wangzonghui/object-tool 包含json、string、集合、excel、zip压缩、pdf、bytes、http等多种工具&#xff0c;欢迎使用。 vm开启ipv6 设置vmware 打开vmware点击编…

C# PaddleInference.PP-HumanSeg 人像分割 替换背景色

效果 项目 VS2022.net4.8OpenCvSharp4Sdcb.PaddleInference 包含4个分割模型 modnet-hrnet_w18 modnet-mobilenetv2 ppmatting-hrnet_w18-human_512 ppmattingv2-stdc1-human_512 代码 using OpenCvSharp; using Sdcb.PaddleInference; using System; using System.Col…

贝锐蒲公英智慧运维方案:实现远程网络监控、管理、维护工业设备

为了提升运维效率&#xff0c;能够及时发现和响应设备的故障、异常和潜在问题。 越来越多的企业都在搭建“集中式”的远程智慧运维体系&#xff0c;以提高运维效率和降低成本。 但是&#xff0c;受限于网络&#xff0c;将不同地域的资源和信息进行整合&#xff0c;实现统一管理…