459. 重复的子字符串(力扣LeetCode)

news2025/1/23 20:48:36

文章目录

  • 459. 重复的子字符串
    • 题目描述
    • 暴力
    • 移动匹配

459. 重复的子字符串

题目描述

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

示例 1:

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

示例 2:

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

示例 3:

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

提示:

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

暴力

这段代码的工作原理如下:

  1. 外层循环每次将字符串s的下一个字符加入到子串a中,这个子串可能是重复的单元。
  2. 内层循环尝试用子串a去匹配整个字符串s。
  3. 如果在某次内层循环中,a成功地匹配了整个s(其中count用于跟踪a在s中重复的次数),那么函数返回true。
  4. 如果a在任何点上失败(字符不匹配),内层循环将会中断,并且外层循环继续尝试下一个可能的子串。

该算法是一个基本的解法,对于每个可能的子串进行尝试,时间复杂度为O(n^2),其中n是字符串s的长度。在最坏的情况下,例如当字符串为全部由相同字符组成时,这个解法可能会比较慢。更高效的算法可能会使用KMP算法或字符串哈希来降低复杂度。

// 定义解决方案类
class Solution {
public:
    // repeatedSubstringPattern成员函数,接受一个字符串s
    bool repeatedSubstringPattern(string s) {
        // a用于存储当前正在检查的子串
        string a="";

        // 循环遍历字符串的前半部分
        // 如果s能由子串重复构成,那么子串的长度不会超过s长度的一半
        for(int i=0; i < s.size() / 2; i++) {
            // 将当前字符添加到子串a中
            a += s[i];

            // count用于记录当前已匹配的字符数
            int count = 0;
            // k用于在子串a中的比较位置
            int k = 0;
            
            // 遍历整个字符串s
            for(int j = 0; j < s.size(); j++) {
                // 如果字符匹配,增加已匹配的字符数,移动k到下一个位置
                if(s[j] == a[k]) {
                    count++;
                    k++;
                    // 如果已匹配字符数等于子串a的长度
                    if(count == a.size()) {
                        // 如果此时已经到达s的末尾,则返回true
                        if(j == s.size() - 1)
                            return true;
                        // 重置已匹配字符数和子串a的比较位置
                        count = 0;
                        k = 0;
                    }
                } else {
                    // 一旦遇到不匹配的情况,立即跳出内层循环
                    break;
                }
            }
        }
        // 如果循环结束都没有找到符合条件的子串,返回false
        return false;
    }
};

移动匹配

当一个字符串s:abcabc,内部由重复的子串组成,那么这个字符串的结构一定是这样的:
在这里插入图片描述
也就是由前后相同的子串组成。

那么既然前面有相同的子串,后面有相同的子串,用 s + s,这样组成的字符串中,后面的子串做前串,前面的子串做后串,就一定还能组成一个s,如图:
在这里插入图片描述
所以判断字符串s是否由重复子串组成,只要两个s拼接在一起,里面还出现一个s的话,就说明是由重复子串组成。

当然,我们在判断 s + s 拼接的字符串里是否出现一个s的的时候,要刨除 s + s 的首字符和尾字符,这样避免在s+s中搜索出原来的s,我们要搜索的是中间拼接出来的s。

代码如下:

// 定义解决方案类
class Solution {
public:
    // 定义成员函数repeatedSubstringPattern,它接受一个字符串s
    bool repeatedSubstringPattern(string s) {
        // 创建一个新字符串t,由字符串s重复拼接一次得来,这样任何s的重复子串模式都会在新字符串t中出现两次
        string t = s + s;

        // 从t的开头删除一个字符,这是为了除去原始字符串的单独完整出现
        t.erase(t.begin());
        // 从t的尾部删除一个字符,同样是为了确保消除原始字符串的单独完整出现
        t.erase(t.end() - 1);

        // 在新字符串t中寻找原始字符串s
        // 如果发现s存在于t中(并且不是在开头或者结尾,因为那些位置已经被删除了)
        // 那么说明s可以由它的一个子串通过重复多次构成
        if (t.find(s) != -1) return true;

        // 如果在t中找不到s作为子串,说明s不能由它的子串通过重复构成,返回false
        return false;
    }
};

  • 时间复杂度: O(n)
  • 空间复杂度: O(1)
  • 不过这种解法还有一个问题,就是 我们最终还是要判断 一个字符串(s + s)是否出现过 s 的过程,大家可能直接用contains,find 之类的库函数。 却忽略了实现这些函数的时间复杂度(暴力解法是m * n,一般库函数实现为 O(m + n))。

如果我们做过 28. 找出字符串中第一个匹配项的下标 题目的话,其实就知道,实现一个 高效的算法来判断 一个字符串中是否出现另一个字符串是很复杂的,这里就涉及到了KMP算法。

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

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

相关文章

Android 15的新功能介绍

虽然谷歌已经发布了 Android 15 Preview 1&#xff0c;但这并不是完整的更新&#xff0c;因为该公司计划在后续的每月测试版中引入新功能。但这可能会让您思考&#xff0c;“Android 15 带来了哪些新功能&#xff1f;” 为了寻找答案&#xff0c;让我们深入了解 Android 15。 …

CSS3技巧37:JS+CSS3 制作旋转图片墙

开学了就好忙啊&#xff0c;Three.js 学习的进度很慢。。。 备课备课才是王道。 更一篇 JS CSS3 的内容&#xff0c;做一个图片墙。 其核心要点是把图片摆成这个样子&#xff1a; 看上去这个布局很复杂&#xff0c;其实很简单。其思路是&#xff1a; 所有图片放在一个 div.…

【小沐学QT】QT学习之OpenGL开发笔记

文章目录 1、简介2、Qt QOpenGLWidget gl函数3、Qt QOpenGLWidget qt函数4、Qt QOpenGLWindow5、Qt glut6、Qt glfw结语 1、简介 Qt提供了与OpenGL实现集成的支持&#xff0c;使开发人员有机会在更传统的用户界面的同时显示硬件加速的3D图形。 Qt有两种主要的UI开发方…

计算机网络:路由协议

路由协议简介 路由协议是计算机网络中不可或缺的一部分&#xff0c;它们负责确定数据包从源地址到目的地址的最佳路径。想象一下&#xff0c;如果你是一个数据包&#xff0c;路由协议就像是地图或导航工具&#xff0c;指导你如何到达目的地。 目录 路由协议简介 工作原理简化…

动态更新(LanqiaoOJ)

2024.2.27 前缀和、差分解析 前缀和与差分 图文并茂 超详细整理(全网最通俗易懂)_前缀和差分-CSDN博客 k倍区间【暴力、前缀和】 输入描述 第一行包含两个整数 NN 和 KK( 1≤N,K≤1051≤N,K≤105 )。 以下 N 行每行包含一个整数 AiAi​ ( 1≤Ai≤1051≤Ai​≤105 ) 输…

【Java】常用实用类及java集合框架(实验六)

目录 一、实验目的 二、实验内容 三、实验小结 3.1 常用实用类 3.2 Java集合框架 一、实验目的 1、掌握java常用类的方法 2、掌握String类与数值类型数据的相互转化 3、掌握正则表达式的应用 4、掌握常用集合的创建和操作方法 二、实验内容 1、菜单的内容如下&#x…

CUDA C:核函数、主机函数、设备函数

相关阅读 CUDA Chttps://blog.csdn.net/weixin_45791458/category_12530616.html?spm1001.2014.3001.5482 核函数(Kernel Function)指的是在主机(CPU)调用&#xff08;某些情况下也可以在设备调用&#xff09;&#xff0c;在设备(GPU)上执行的函数&#xff0c;使用__global__…

将法律条文很美观的复制到word上

前言 目前很多法律条款都没有现成的PDF或者word格式的供大家下载&#xff0c;这个时候呢&#xff0c;领导又要求你帮他搞定&#xff0c;这就很。。。。 步骤 复制全部条款到word中使用wps的排版功能&#xff0c;将空格和空段落全部移除 3. 设置好你需要的格式 标题&#xff…

PIGX从零开始快速构建分布式服务

PIGX从零开始快速构建分布式服务 一、环境搭建1.代码下载2 更改maven目录2更改完成后等待jar包的下载3 认真阅读README.md4 更改服务名5 编译代码 二、基础服务auth、upms、gateway配置与启动1 搭建数据库2 初始化pig数据库信息3构建nacos服务端3.1 更改pig-register配置并启动…

SQL注入漏洞解析--less-7

我们先看一下第七关 页面显示use outfile意思是利用文件上传来做 outfile是将检索到的数据&#xff0c;保存到服务器的文件内&#xff1a; 格式&#xff1a;select * into outfile "文件地址" 示例&#xff1a; mysql> select * into outfile f:/mysql/test/one f…

Mistral AI 推出最新Mistral Large模型,性能仅次于GPT 4

模型特点 • Mistral Large具有顶级的推理能力&#xff0c;适用于复杂的多语言推理任务&#xff0c;包括文本理解、转换和代码生成。• 32K 令牌的上下文窗口&#xff0c;能够从大型文档中精确回忆信息。• 精确的指令跟随能力&#xff0c;允许开发者设计他们的审核政策。• 支…

SpringCloud--Nacos解析

一、Nacos简介 Spring Cloud Alibaba Nacos是一个用于动态服务发现、配置管理和服务管理的平台&#xff0c;是阿里巴巴开源的一个项目&#xff0c;旨在简化微服务架构中的服务治理。Nacos 提供了一组简单易用的特性集&#xff0c;可以快速的实现动态服务发现、服务配置、服务元…

轻量级模型,重量级性能,TinyLlama、LiteLlama小模型火起来了,针对特定领域较小的语言模型是否与较大的模型同样有效?

轻量级模型&#xff0c;重量级性能&#xff0c;TinyLlama、LiteLlama小模型火起来了&#xff0c;针对特定领域较小的语言模型是否与较大的模型同样有效? 当大家都在研究大模型&#xff08;LLM&#xff09;参数规模达到百亿甚至千亿级别的同时&#xff0c;小巧且兼具高性能的小…

【基于React实现共享单车管理系统】—项目简介(一)

【基于React实现共享单车管理系统】—项目简介&#xff08;一&#xff09; 一、项目整体架构

【自然语言处理三-自注意self attention】

自然语言处理三-自注意力 self attention 自注意力是什么&#xff1f;自注意力模型出现的原因是什么&#xff1f;词性标注问题解决方法1-扩展window&#xff0c;引用上下文解决方法2-运用seq2seq架构新问题来了&#xff1a;参数量增加、无法并行的顽疾 自注意力self attention模…

kali Linux 渗透系统的安装、提权与汉化(初识 Linux 系统)

目录 一、安装 kali 二、汉化 kali 三、kali 提权 1、暂时提权 root 2、永久提权 root 四、Linux 常用命令 一、安装 kali 官方镜像下载地址 https://www.kali.org/get-kali/#kali-virtual-machines 我这里推荐的是下载 vmx 文件&#xff0c;下载后解压&#xff0c;在 …

牛客前端八股文(每日更新)

1.说说HTML语义化&#xff1f; 得分点&#xff1a;语义化标签、利于页面内容结构化、利于无CSS页面可读、利于SEO、利于代码可读 1&#xff0c;标签语义化是指在开发时尽可能使用有语义的标签&#xff0c;比如header&#xff0c;footer&#xff0c;h&#xff0c;p&#xff0c…

uniapp实现单选框

采用uniapp-vue3实现的一款单选框组件&#xff0c;提供丝滑的动画选中效果&#xff0c;支持不同主题配置&#xff0c;适配web、H5、微信小程序&#xff08;其他平台小程序未测试过&#xff0c;可自行尝试&#xff09; 可到插件市场下载尝试&#xff1a; https://ext.dcloud.net…

【X806开发板试用】串口数据透传阿里云IOT

上成果 阿里云对接需要用的是PRODUCTKEY&#xff0c;DEVICENAME和DEVICESECRET&#xff0c;开始直接用MQTT的例子硬怼&#xff0c;没成功&#xff0c;后面看了文档&#xff0c;发现阿里云对接的client_id,username和password是通过三要素生成的。 找了一下代码&#xff0c;发…

禁止safari浏览器网页双击缩放功能

普通浏览器 普通浏览器&#xff0c;只需要增加meta标签禁止缩放功能就行了 <meta content"widthdevice-width, initial-scale1.0, maximum-scale1.0, user-scalable0;" name"viewport" /> user-scalableno或0 //禁止双指缩放页面initial-scale1.0…