Leetcode:459. 重复的子字符串(C++)

news2024/11/14 6:05:29

目录

问题描述:

实现代码与解析:

 移动匹配法:

原理思路:

 利用kmp法:

原理思路:

暴力法:

原理思路:  


问题描述:

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

示例 1:

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

示例 2:

输入: s = "aba"
输出: false

示例 3:

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

实现代码与解析:

 移动匹配法:

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

        还有一种简短的写法:

class Solution {
public:
    bool repeatedSubstringPattern(string s) {
        return (s + s).find(s, 1) != s.size();
    }
};

原理思路:

        满足条件的字符串一定可以找到前后子串相等的子串,我们将子串复制一份拼接在一起,这时,中间的字符串变为后子串加前子串,在其中找到原子串,说明这个字符串可由一个子串重复构成,至于为什么删除首字符和尾字符,因为我们要排除找到的是自身的字符串,确保找到的是我们拼接而来的。

        第二个简短代码,它是从下标为1开始找的,若不等于s.size(),也就是在找到末尾一定匹配的子串前,在中间没找到匹配的,所以说明该字符串不能由子串重复构成,与删除首尾字符原理相同。下面给出一个例子,便于理解。

 利用kmp法:

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

原理思路:

        先说结论:前缀中,不包含最长公共前后缀相同的部分,即为组成该字符串的重复子串。原理需要推到,大家只要记住,前缀和后缀对应的位置字符相同,字符串数组中同一个下标的字符相同,这两点,就能理解为什么得出的这个结论。同样给出图片,便于大家理解:

        根据红线的连接就可以看出,最小重复子串是如何找出来的了,看不懂的话再看看我让大家注意的那两点。

暴力法:

class Solution {
public:
    bool repeatedSubstringPattern(string s)
    {
        int len=s.size();
        for(int i=1;i<=len/2;i++)
        {
            string temp;
            if(len%i!=0)
            {
                continue;
            }
            //完整拼接复原
            for(int j=0;j<len/i;j++)
            {
                //拼接子串
                for(int k=0;k<i;k++)
                {
                    temp+=s[k];
                }
            }
            if(temp==s)
            {
                return true;
            }
        }
        return false;     
    }
};

原理思路:  

        直接暴力法把所有的可能找出来,比较简单和好理解,就是循环遍历,根据倍速拼接,然后复原,看是否与原字符串相等。

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

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

相关文章

55 处理错误的树形数据结构导致不断地添加元素到集合中 OOM

前言 呵呵 这是最近一个 前同事/朋友 碰到的一个问题 主要的问题是 在 dump 文件中发现了很多 LinkedList$Node 的节点 然后 整个问题 抛出来的错误是 OOM 呵呵 这种问题 还是相当好处理的 这里 仅仅是 简单记录一下 前因 后果 测试用例 /*** Test11OomByTree** aut…

关于2022年

也算是传统了&#xff0c;每年到年底的时候&#xff0c;总喜欢做点总结&#xff0c;或许类似于企业里面的年底复盘&#xff0c;但更多的还是碎碎念。往年一般会放在农历新年那一天&#xff0c;今年做点小改变&#xff0c;影响不大。 回顾过去的一年&#xff0c;发现自己基本上…

【HR-VITON】虚拟换衣算法pre-processing复现全过程记录

Link of original Github repo Link of personal made study case of HR-VITON ContentPre1、OpenPose&#xff08;On colab, need GPU&#xff09;2、Human ParseMethod 1: ColabMethod 2: Local or Server3、DensePose (On colab, GPU or CPU)4、Cloth Mask (On colab, GPU o…

【MySQL】InnoDB数据页结构

文章目录1. 前言2. 数据页结构3. 记录在页中的存储4. 记录头信息5. 页目录&#xff08;Page Directory&#xff09;6. 页面头部&#xff08;Page Header&#xff09;7.文件头部&#xff08;Fiile Header&#xff09;8. 文件尾部&#xff08;File Trailer&#xff09;不知不觉20…

JVM调优相关说明

前言 其实听着JVM调优这个词有些高大上&#xff0c;但是等你真正了解了他的内在原理后&#xff0c;还是很容易的。再简单 JVM调优大致可分为如下&#xff1a; 解决JVM运行过程中的问题&#xff08;主要就是内存溢出的问题&#xff09;优化JVM运行时的环境&#xff0c;提高运…

多线程问题(四)

目录 一、常见的锁策略 1、乐观锁 VS 悲观锁 2、读写锁 VS 普通的互斥锁 3、重量级锁 VS 轻量级锁 4、挂起等待锁 VS 自旋锁 6、公平锁 VS 非公平锁 7、可重入锁 VS 不可重入锁 8、synchronized锁的性质 二、CAS 1、CAS的伪代码 2、CAS的应用 a、实现原子类…

【Spring系列】一篇文章开启你的 SpringBoot 之旅

SpringBoot 快速入门一. 环境搭建1.1 环境准备Java环境准备(本人是 JDK 1.8)开发工具 IntelliJ IDEAMaven (可使用 IntelliJ IDEA 自带)二. 快速开始2.1 新建项目打开IDEA 新建 SpringBoot 项目2.2 运行项目Spring Boot 项目运行分析尝试在浏览器中访问2.3 完成第一个接口新建c…

ArcGIS基础实验操作100例--实验30清除坐标系信息

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验30 清除坐标系信息 目录 一、实验背景 二、实验数据 三、实验步骤 方法一&#xff…

运维管理平台OEM定制集成开发,激发IT价值

对硬件设备商而言&#xff0c;借助优秀的网管、运维管理平台&#xff0c;可以形成完整的产品解决方案&#xff0c;直接提升产品的形象和适用范围。同时还可以通过网管、运维管理平台&#xff0c;切入到外围的产品及集成领域&#xff0c;并在用户后续的升级改造活动中占据有利位…

12.31日报

纠正前天的错误&#xff1a; 前天我写&#xff1a; 不知道在mapper中的增删改方法返回值int的值&#xff0c;和含义&#xff0c;在调用方法时也没有定义int来接参&#xff0c;都是直接调用。于是我定义int i&#xff0c;并打印输出&#xff0c;使用postman调用接口方法&#xf…

R语言hdnom包进行高维惩罚 Cox 回归模型绘制列线图-校准曲线-时间依赖ROC-外部验证

Hdnom包可以用于用于给高维数据构建Cox 模型、绘制列线图-校准曲线-时间依赖ROC-外部验证&#xff0c;而且Hdnom包简化了建模过程&#xff0c;带有自动选择变量功能&#xff0c;将用户从繁琐且容易出错的调参过程中解放出来. hdnom提供了多项自动调参和模型选择功能&#xff…

【OpenAI】基于 Gym-CarRacing 的自动驾驶项目 | 前置知识介绍 | 项目环境准备

猛戳&#xff01;跟哥们一起玩蛇啊 &#x1f449; 《一起玩蛇》&#x1f40d; &#x1f4ad; 写在前面&#xff1a; 本篇是关于多伦多大学自动驾驶专业项目 Gym-CarRacing 的博客。GYM-Box2D CarRacing 是一种在 OpenAI Gym 平台上开发和比较强化学习算法的模拟环境。它是流行…

jscharting.js v3.3.1.20220428 Crack

jscharting.js 3.3 版带来了主要的新组织结构图和甘特图扩展&#xff0c;包括甘特关键路径图、组织连接线样式和选择、仪表板小部件、象形图等等。图表渐变支持扩展到包括图标和动态点和系列渐变填充。 JSCharting 团队使用新功能、图表类型和图表小部件制作了超过 55 个高级示…

从发展的趋势来看,数字技术理应是产业互联网时代的驱动力

事实上&#xff0c;以往&#xff0c;我们所经历的那个互联网玩家频出的年代&#xff0c;其实就是一个以互联网技术为主导的年代。在那样一个年代里&#xff0c;互联网技术几乎是解决一切痛点和难题的万能解药&#xff0c;几乎是破解一切行业痛点和难题的杀手锏。任何一个行业&a…

【Java语言】—顺序结构、分支结构

流程控制语句 Java提供了一些流程控制语句&#xff0c;来控制程序的执行流程。 1.顺序结构 按照代码的先后顺序&#xff0c;以此执行程序。 2.分支结构 &#xff08;1&#xff09;if分支 根据判断的结果&#xff08;真或假&#xff09;决定执行某个分支的代码。 if分支有三…

Docker+Nginx打包部署前后端分离项目

DockerNginx打包部署前后端分离项目1、问题描述2、项目打包2.1 前端项目打包2.1.1 修改vue.config.js文件2.1.2 router配置中添加base属性2.1.3 打包前端项目2.2 后端项目打包2.3 将前端和后端的打包文件上传到服务器3 nginx反向代理配置4、后端通过Dockerfile打包成docker镜像…

目标检测-锚框

目标检测算法通常会在输入图像中采样大量的区域&#xff0c;然后判断这些区域中是否包含我们感兴趣的目标&#xff0c;并调整区域边界从而更准确地预测目标的真实边界框&#xff08;ground-truth bounding box&#xff09;。 不同的模型使用的区域采样方法可能不同。 这里我们介…

vue3 antd项目实战——Form表单的重置【使用resetFields()重置form表单数据、清空输入框】

vue3 ant design vue项目实战——Form表单【resetFields重置form表单数据】关于form表单的文章场景复现resetFields()重置表单数据项目实战关于form表单的文章 文章内容文章链接Form表单提交和校验https://blog.csdn.net/XSL_HR/article/details/128495087?spm1001.2014.3001…

十二、Kubernetes核心技术Service详解、实例

1、概述 我们都知道Kubernetes会为每个pod分配一个独立的IP&#xff0c;然而却存在如下问题&#xff1a; Deployment控制的3个pod&#xff0c;其中一个Pod出现问题&#xff0c;这个时候给销毁重新创建后Pod Ip会变化Pod IP 仅仅是集群内可见的虚拟IP&#xff0c;外部无法访问 …

AcWing的Linux基础课学习笔记(未学完)

目录版本B站试听课&#xff08;1.常用文件管理命令&#xff09;1.1文件系统1.2文件管理常用指令版本 服务器&#xff1a;Linux Ubuntu 20.04     我的笔记本&#xff1a;Acer Nitro AN515-55&#xff08;所以如果我要在AC Terminal里复制粘贴的话分别是&#xff1a;CtrlFnI…