当前位置: 首页 > news >正文

(第15天)【leetcode题解】459、重复的子字符串

目录

  • 459、重复的子字符串
    • 题目描述
    • 暴力匹配
      • 思路
      • 代码
    • 字符串匹配
      • 思路
      • 代码
      • 与暴力匹配的不同
    • KMP解法
      • 思路
      • 代码
      • KMP算法的核心和用途

459、重复的子字符串

题目描述

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

暴力匹配

思路

  1. 推理
  • 如果存在这样的子串,那么这个子串一定是s的前缀
  • s的长度n一定是子串长度n1的整数倍
  • s中的元素s[i]与往前移n1的元素s[i-n1]相同
  1. 方法

因此从小到大枚举出所有可能的子串长度n1,再对这个子串进行上述的判断即可。
优化:这个子串至少要在s中重复一次,所以n1的范围为[1,n/2]。

代码

class Solution {
public:bool repeatedSubstringPattern(string s) {int n = s.size();//i代表子串的长度,应从1开始for (int i = 1; i <= n / 2; i++) {//判断该子串是否为目标子串if (n % i == 0) {bool match = true;//判断之后的字符往前移子串长度i之后是否相等//从子串之后开始遍历整个字符串for (int j = i; j < n; j++) {if (s[j] != s[j - i]) {match = false;break;} }if (match) return true;}}return false;}
};

时间复杂度:O(n2);枚举子串的时间复杂度为O(n),遍历判断子串的时间复杂度为O(n)。
空间复杂度:O(1);

字符串匹配

思路

  1. 如果s满足题目要求,那么s具有以下性质:
  • 设s的长度为n,子串长度s1为n1.
  • 可以把s写成n/n1个子串s1排列的形式 : s——>s1s1s1s1…
  • 那么把第一个s1移到最后面,字符串s不变
  1. 根据性质,可以证明:
  • 因为1 <= n1 < n,那么把两个字符串s连在一起得到S
  • 把连在一起后的字符串S移除前后第一个元素
  • 这时,字符串s一定是拼接串S的子串
  1. 根据证明结果,得到方法:
  • 拼接两个字符串s
  • 移除第一个和最后一个字符
  • 如果s是其中的子串,则满足题目要求

代码

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

与暴力匹配的不同

通过推理,得到一种满足要求是的情况,只要针对这个情况进行判断即可。

KMP解法

思路

  1. 假设推理
  • 假设这个文本串由重复子串组成
  • 找到这个文本串的最长公共前后缀
  • 文本串切割掉最长公共前后缀,剩下的就是重复子串
  1. 可用的结论
  • 设文本串s由n个长度为x的子串组成,则文本串全长为nx
  • 最长公共前后缀由m个长度为x的子串组成,长度为mx
  • 则重复子串长度为(n-m)xn-m=1
  • 当全长nx对重复子串长度(n-m)x取余等于0时(即nx % (n-m)x == 0 or nx % x == 0),证明(n-m)x代表的子串为重复子字符串。
  1. 方法
  • 求出next数组,next数组长度为len
  • 使用next数组存储文本串中最长公共前后缀的长度next[len - 1]
  • 如果 len % (len -next[len - 1]) == 0,则表明存在重复子字符串

代码

class Solution {
public://得出next数组void getNext(int* next, string& s) {//初始化int j = 0;//前缀末尾从0开始next[0] = j;//从长度为2的子串开始求最长公共前后缀长度for (int i = 1; i < s.size(); i++) {//前后缀末尾不匹配时while (j >0 && s[i] != s[j]) j = next[j - 1];//j回退//前后缀末尾匹配时if (s[i] == s[j]) {j++;//j(和i)往后移一位}next[i] = j;//下标j为当前子串(末尾下标为i)的最长公共前后缀长度}}bool repeatedSubstringPattern(string s) {int next[s.size()];//创建长度为字符串长度的前缀表getNext(&next[0], s);//使用最长公共前后缀长度判断是否由重复的子字符串组成int len = s.size();//next[len - 1] == 0时,证明整个字符串最长公共前后缀长度为0//根据推理得出的结论:当len % (len - next[len-1]) == 0 时证明(有重复的子字符串/最后一段字符串为重复子字符串)if (next[len - 1] != 0 && len % (len - next[len-1]) == 0) return true;return false;}
};

时间复杂度:O(n);得到前缀表时遍历字符串需要O(n),判断重复子字符串只用了固定的操作数。
空间复杂度:O(n);需要前缀表存储字符串的所有前缀子串(包括它自身)的最长公共前后缀长度。

KMP算法的核心和用途

  1. 核心
  • 前缀表next,其中存储了字符串的最长公共前后缀长度
  • 匹配时,使用前缀表记录的最长公共前后缀长度来进行回退
  • 总结:存储字符串的最长公共前后缀长度的前缀表、回退思想。
  1. 用途
  • 使用前缀表回退查找子字符串。
  • 使用前缀表中记录的最长公共前后缀长度来进行一些数字上的判断。

相关文章:

(第15天)【leetcode题解】459、重复的子字符串

目录 459、重复的子字符串题目描述暴力匹配思路代码 字符串匹配思路代码与暴力匹配的不同 KMP解法思路代码KMP算法的核心和用途 459、重复的子字符串 题目描述 给定一个非空的字符串 s &#xff0c;检查是否可以通过由它的一个子串重复多次构成。 暴力匹配 思路 推理 如果…...

PostgreSQL的学习心得和知识总结(一百四十二)|深入理解PostgreSQL数据库数据库之 Continuous Integration

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…...

【外币兑换,简单贪心】

小明刚从美国回来&#xff0c;发现手上还有一些未用完的美金&#xff0c;于是想去银行兑换成人民币。可是听说最近人民币将会升值&#xff0c;并从金融机构得到了接下来十二个月可能的美元对人民币汇率&#xff0c;现在&#xff0c;小明想要在接下来一年中把美金都兑换成人民币…...

数据库入门(sql文档+命令行)

一.基础知识 1.SQL&#xff08;Structured Query Language&#xff09;结构化查询语言分类&#xff1a; DDL数据定义语言用来定义数据库对象&#xff1a;数据库、表、字段DML数据操作语言对数据库进行增删改查DQL数据查询语言查询数据库中表的信息DCL数据控制语言用来创建数据…...

【机器学习300问】84、AdaGrad算法是为了解决什么问题?

神经网络的学习的目的是找到使损失函数的值尽可能小的参数。这是寻找最优参数的问题&#xff0c;解决这个问题的过程称为最优化。因为参数空间非常复杂&#xff0c;无法轻易找到最优解&#xff0c;而且在深度神经网络中&#xff0c;参数的数量非常庞大&#xff0c;导致最优化问…...

Java算法-力扣leetcode-14. 最长公共前缀

14. 最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 ""。 示例 1&#xff1a; 输入&#xff1a; strs ["flower","flow","flight"] 输出&#xff1a; "fl"示…...

视频拼接融合产品的产品与架构设计(二)

视频拼接融合产品的产品与架构设计一 以上是第一期&#xff0c;以前思考的时候还是比较着急&#xff0c;现在思考的更多了&#xff0c;现实世界的拼接更加需要我们沉下心来做&#xff0c;尤其是对于更多画面&#xff0c;画面更加清晰怎么做 本篇章不在于其他功能&#xff0c;在…...

【docker 】push 镜像到私服

查看镜像 docker images把这个hello-world 推送到私服 docker push hello-world:latest 报错了。不能推送。需要标记镜像 标记Docker镜像 docker tag hello-world:latest 192.168.2.1:5000/hello-world:latest 将Docker镜像推送到私服 docker push 192.168.2.1:5000/hello…...

Java框架精品项目【用于个人学习】

源码获取&#xff1a;私聊回复【项目关键字】获取 更多选题参考&#xff1a; Java练手项目 & 个人学习等选题参考 推荐菜鸟教程Java学习、Javatpoint学习 前言 大家好&#xff0c;我是二哈喇子&#xff0c;此博文整理了各种项目需求 此文下的项目用于博主自己学习&#x…...

每周一算法:无向图的最小环

题目链接 观光之旅 题目描述 给定一张无向图&#xff0c;求图中一个至少包含 3 3 3 个点的环&#xff0c;环上的节点不重复&#xff0c;并且环上的边的长度之和最小。 该问题称为无向图的最小环问题。 你需要输出最小环的方案&#xff0c;若最小环不唯一&#xff0c;输出…...

分布式websocket IM即时通讯聊天开源项目如何启动

前言 自己之前分享了分布式websocket的视频有同学去fork项目了&#xff0c;自己启动一下更方便理解项目嘛。然后把项目启动需要的东西全部梳理出来。支持群聊单聊,表情包以及发送图片。 支持消息可靠&#xff0c;消息防重&#xff0c;消息有序。同时基础架构有分布式权限&…...

tensorflow学习笔记(1)环境准备写个简单例子(小白手册)-20240506

一、安装python、tensorflow 1、Mac上默认python已经安装,自带pip 2、pip3 install tensorflow 如果报错,提示pip3版本较低,可以根据提示来更新pip3:/Library/Developer/CommandLineTools/usr/bin/python3 -m pip install --upgrade pip 3、然后再使用pip3来安装tensor…...

kubernate 基本概念

一 K8S 是什么&#xff1f; K8S 全称&#xff1a;Kubernetes 1 kubernate基本概念 作用&#xff1a; 用于自动部署、扩展和管理“容器化&#xff08;containerized&#xff09;应用程序”的开源系统。 可以理解成 K8S 是负责自动化运维管理多个容器化程序&#xff08;比如…...

【系统架构师】-选择题(十二)计算机网络

1、网闸的作用&#xff1a;实现内网与互联网通信&#xff0c;但内网与互联网不是直连的 2、管理距离是指一种路由协议的路由可信度。15表示该路由信息比较可靠 管理距离越小&#xff0c;它的优先级就越高&#xff0c;也就是可信度越高。 0是最可信赖的&#xff0c;而255则意味…...

代码随想录|总结篇

完结篇&#xff1a; 60天&#xff0c;还是坚持了下来&#xff0c;达成算法路上的一个小目标。 加入代码随想录训练营之前&#xff0c;也断断续续刷到了树那一章节&#xff0c;但后面因为导师项目等种种情况&#xff0c;一直耽搁到年后。年后打算重新开始刷题时&#xff0c;正好…...

网络编程套接字和传输层tcp,udp协议

认识端口号 我们知道在网络数据传输的时候&#xff0c;在IP数据包头部有两个IP地址&#xff0c;分别叫做源IP地址和目的IP地址。IP地址是帮助我们在网络中确定最终发送的主机&#xff0c;但是实际上数据应该发送到主机上指定的进程上的&#xff0c;所以我们不仅要确定主机&…...

通过wget下载ftp文件

通过wget下载ftp文件 基础用法带密码的http文件带密码的ftp文件补充 基础用法 在下载的过程中会显示进度条&#xff0c;包含百分比&#xff0c;已下载字节&#xff0c;下载速度&#xff0c;剩余时间。 # 下载单个文件 wget [url_file]# 下载目录全部文件 wget [url_dir/*] wg…...

Acrobat Pro DC 2023 for Mac:PDF处理的终极解决方案

Acrobat Pro DC 2023 for Mac为Mac用户提供了PDF处理的终极解决方案。它具备强大的文档处理能力&#xff0c;无论是查看、编辑还是创建PDF文件&#xff0c;都能轻松胜任。在编辑功能方面&#xff0c;Acrobat Pro DC 2023支持对文本、图像进行精准的修改和调整&#xff0c;还能添…...

map容器

目录 map构造和赋值 map大小和交换 map插入和删除 map查找和统计 map排序 map构造和赋值 map中所有元素都是pair&#xff08;即一对&#xff09; pair中第一个元素为key&#xff08;键值&#xff09;&#xff0c;起到索引作用&#xff0c;第二个元素为value&#xff08;…...

GNU/Linux - 是否可以多次打开同一个设备文件

使用设备/dev/ttyS1举例来说明。 一个设备文件打开多次 在 Linux 中&#xff0c;多次打开 /dev/ttyS1 以读取数据通常是可以接受的。多次打开 /dev/ttyS1 并向 /dev/ttyS1 发送数据时&#xff0c;所有打开的文件描述符都能接收数据。每个打开的文件描述符都代表与串行端口的独立…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时&#xff0c;遇到的一些问题总结一下 [参考文档]&#xff1a;https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现&#xff1a; 今天在看到这个教程的时候&#xff0c;在自己的电…...

LangFlow技术架构分析

&#x1f527; LangFlow 的可视化技术栈 前端节点编辑器 底层框架&#xff1a;基于 &#xff08;一个现代化的 React 节点绘图库&#xff09; 功能&#xff1a; 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...