代码随想录二刷 | 字符串 |重复的子字符串

代码随想录二刷 | 字符串 |重复的子字符串

  • 题目描述
  • 解题思路 & 代码实现
    • 移动匹配
    • KMP算法

题目描述

459.重复的子字符串

给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。

示例 1:

输入: s = “abab”
输出: true
解释: 可由子串 “ab” 重复两次构成。

示例 2:

输入: s = “aba”
输出: false

示例 3:

输入: s = “abcabcabcabc”
输出: true
解释: 可由子串 “abc” 重复四次构成。 (或子串 “abcabc” 重复两次构成。)

提示:

  • 1 <= s.length <= 104
  • s 由小写英文字母组成

解题思路 & 代码实现

移动匹配

如果一个字符串是由重复的子串构成,也就是由前后相同的子串构成。那么用后面的子串做前串,前面的子串做后串,也依然能组成原来的字符串。

所以判断字符串 s 是否由重复子串组成,只要两个s拼在一起里面还能出现一个s,就说明s是由重复子串组成的。

在判断 s + s 拼接的字符串时,要刨除 s + s 的首字符和尾字符,这样避免在 s + s中搜索出原来的s,毕竟我们要搜索的是中间拼接出来的 s。

class Solution {
public:bool repeatedSubstringPattern(string s) {string t = s + s;t.erase(t.begin());t.erase(t.end() - 1);if (t.find(s) != std::string::npos)return true;return false;}
};

KMP算法

在重复子串组成的字符串中,最长相等前后缀不包含的子串就是最小重复子串,拿字符串s = "abababab"举例:
在这里插入图片描述
假设字符串 s 由 n 个重复子串构成,重复子串的长度为x,所以 s = n * x

因为字符串 s 的最长公共前后缀的长度一定不是 s 本身,所以最长相同前后缀的长度为m * x,而且n - m = 1。这里可以从上图中看出,n 和 m 正好相差一个 x 的长度。

所以,如果nx % (n - m) * x = 0,说明s的长度可以整除一个重复子串的长度,也就说明有重复出现的子字符串。

假设数组的长度为len,那么最长公共前后缀的长度就是next[len - 1] + 1,这里+1是因为采用了统一减一的操作。

那么,数组的长度 - 最长公共前后缀就是一个x的长度,只要数组的长度能整除 x 的长度,那么就存在重复的子字符串。

那么,套用上面的nx % (n - m) * x,可得len % (len - (next[len - 1] + 1)) == 0

class Solution {
public:void getNext(int* next, const string& s) {int j = -1;for (int i = 1; i < next.size(); i++) {while (j >= 0 && next[i] != next[j + 1]) {j = next[j];}if (next[i] == next[j + 1]) {j++;}next[i] = j;}}bool repeatedSubstringpattern(string s) {if (s.size() = 0) {return false;}int next[s.size()];getNext(next, s);len = s.size();if (next[len - 1] + 1 != 0 && len % (len - (next[len - 1] + 1)) == 0) {return true;}return false;}
};

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

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

相关文章

力扣二叉树--第三十八天

前言 后面几天准备期末考试&#xff0c;要断更了。8号or 9号再开始。 内容 一、二叉搜索树中的众数 501. 二叉搜索树中的众数 给你一个含重复值的二叉搜索树&#xff08;BST&#xff09;的根节点 root &#xff0c;找出并返回 BST 中的所有 众数&#xff08;即&#xff0c…

XC4060 40V降5V/3.3V 0.6A小电流高耐压芯片 适用于单片机供电输出、电池供电设备

XC4060器件是高效率&#xff0c;同步降压DC/DC稳压器。具有较宽的输入范围&#xff0c;它们适用于广泛的应用&#xff0c;例如来自非稳压源的功率调节。他们的特点是一个长距离(500mQ/300mQ2型) 内部开关的效率最高 (92%)。Sum od (非A选项)和PWM模式(A选项)&#xff0c;工作频…

大部分只使用这 14 个 Git 命令就够了

必须了解的命令整理 1&#xff0c;git init 初始化一个新的Git仓库。 这将在当前目录中创建一个名为".git"的子目录&#xff0c;Git会将所有仓库的元数据存储在其中。 2&#xff0c;git clone 克隆一个已存在的仓库。 这会创建一个本地仓库的副本&#xff0c;包…

【C语言】深入理解C语言中的数学运算和类型转换

文章目录 引言取负运算的奥秘源码探索分析与解读 浮点数运算的精细差异源码分析 精度损失与隐式类型转换精度和除零运算探究float类型和double类型的精度各是多少&#xff08;即十进制有效位的位数&#xff09;&#xff1f;在你的机器上&#xff0c;“负数开方”是如何处理的&a…

【Spring Boot】如何集成mybatis-plus

在pom文件中导入maven坐标 <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.23</version></dependency><!--mybatis-plus--><dependency><groupId>com.ba…

uniapp 连接斑马PDA调试

1、先把PDA设置成开发者模式 打开设置--》关于手机 --》单击版本号&#xff0c;5次以上 连线单击5次以上 2、后退--》找到系统 --》高级 3、打开 --》开发都模式 4、找到调试 --》 打开USB调试 5、设置USB偏好设置&#xff0c;插入电脑连接PDA就会在通知栏上显示&#xff0c;默…

蓝桥杯 动态规划

01 数字三角形 #include<bits/stdc.h> using namespace std; const int N105; using lllong long; ll a[N][N],dp[N][N]; int main(){int n;cin>>n;for(int i1;i<n;i){for(int j1;j<i;j){cin>>a[i][j];}}for(int i5;i>1;i--){for(int j1;j<i;j){…

拒绝废话,直接开画!Python零基础教程之画图

引文 很多教程&#xff0c;开始教python&#xff0c;就是语法呀&#xff0c;字符类型这些基础的&#xff0c;虽说是基础&#xff0c;你也不能说没用。 但是&#xff0c;对于前期要快速成长的我们来说&#xff0c;属实不够看。 我们是新手&#xff0c;我们是菜鸟&#xff0c;但…

OTFX欧汇提供更优质的外汇交易产品和服务

OTFX的外汇交易明智决策能力&#xff1a;准确捕捉外汇市场机会&#xff0c;实现稳定盈利 把握机遇&#xff0c;重要的是争取而不是等待。在金融市场中&#xff0c;明智的决策能力对于外汇交易成败至关重要。及时的断绝&#xff0c;果断的出手&#xff0c;才能够保证出手的成功…

提升Jmeter测试效率的9种参数化方法!

jmeter工具无论做接口测试还是性能测试&#xff0c;参数化都是一个必须掌握且非常有用的知识点。参数化的使用场景: 1&#xff09;多个请求都是同一个ip地址&#xff0c;若服务器地址更换了&#xff0c;则脚本需要更改每个请求的ip 2&#xff09;注册账号&#xff0c;不允许账…

详解FreeRTOS:软件定时器(高级篇—4)

目录 1、定时器简介 2、定时器运行机制 3、定时器服务任务与队列 4、定时器相关配置

力扣572:另一棵树的子树

力扣572&#xff1a;另一棵树的子树 给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所…

k8s部署的四种方案

文章目录 一、基于二进制文件的部署方式1. 准备 k8s 组件2. 安装 kubelet 和 kube-proxy3. 安装 kube-apiserver、kube-controller-manager 和 kube-scheduler4. 验证 k8s 集群 二、使用 kubeadm 工具部署1. 准备节点2. 安装 kubeadm 工具3. 初始化 Master 节点4. 配置 k8s 环境…

中英翻译数据集处理

添加数据集 https://aistudio.baidu.com/datasetdetail/209041 解压数据集 !unzip /home/aistudio/data/data209041/translation2019zh.zip处理成voc import pandas as pd import numpy as np from tqdm import tqdmdef gen_sp(en_voc1)</

用友NC FileUploadServlet 反序列化RCE漏洞复现

0x01 产品简介 用友 NC 是用友网络科技股份有限公司开发的一款大型企业数字化平台。 0x02 漏洞概述 用友 NC nc.file.pub.imple.FileUploadServlet 反序列化漏洞,攻击者可通过该漏洞在服务器端任意执行代码,写入后门,获取服务器权限,进而控制整个web服务器。 0x03 复现环…

龙迅LT2611UX 四端口LVDS转HDMI(2.0)

1.描述&#xff1a; LT2611UX 四端口LVDS TO HDMI2.0。 LT2611UX是一款高性能得LVDS到HDMI2.0转换器得STB&#xff0c;DVD应用程序&#xff0c;LVDS输入可以配置单端口&#xff0c;双端口或者四端口&#xff0c;带有一个高速时钟通道&#xff0c;最多可运行三到四个高速数据…

第一节JavaScript 简介与使用

JavaScript简介 JavaScript是互联网上最流行的脚本语言&#xff0c;这门语言可用于HTML和Web&#xff0c;更广泛用于服务器、PC、电脑、智能手机等设备上。 JavaScript是一种轻量级的编程语言。 JavaScript是可插入HTML页面的编程代码。 JavaScript插入HTML页面后&#xff…

算法基础六

搜索插入位置 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 示例 1: 输入: nums [1,3,5,6], target 5 输出: 2 示例 2: 输入: nums [1,3,5,6], target 2 输…

每日一练2023.12.4——正整数【PTA】

一时间网上一片求救声&#xff0c;急问这个怎么破。其实这段代码很简单&#xff0c;index数组就是arr数组的下标&#xff0c;index[0]2 对应 arr[2]1&#xff0c;index[1]0 对应 arr[0]8&#xff0c;index[2]3 对应 arr[3]0&#xff0c;以此类推…… 很容易得到电话号码是18013…

Linux常用快捷键

1. tab 键补全 1)当我们忘记了一些指令怎么写时&#xff0c;可以双击tab键&#xff0c;查看所有指令&#xff0c;显示出来后可以按enter键往下翻&#xff0c;想要取消命令可以按ctrl c。 2)知道开头怎么写&#xff0c;后面的忘了&#xff0c;也可以双击tab键查询开头排列的指令…