题目描述

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

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

示例 2

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

示例 3

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

简单题我重拳出击,这道题一开始准备利用暴力的方法去做,但是感觉是简单题,我想着是一定有巧妙的解题思路。后面想出来以后发现其实和暴力的效果差不多,只是在解题思想上略胜一筹。后面查看官方接替文档,出现了KMP,一看到这个就感觉自己是个废物。由于对KMP已经忘得差不多的状态,等本菜鸟重新学习后在进行讲解,先说一说 “暴力” 和 “移位” 两种解题思路。

解题思路

1.暴力
如果一个长度为N的字符串S满足条件,那么S一定是由长度为n的子字符串s’ 拼接若干次(大于1次)构成。也一定满足下面的条件:

 S=s's's'...N是n的整数倍             s'[i] = S[i+kn]     (0< = i< n  , 0 <= k < N/n )

我们可以通过暴力的方式,将长度为n的子字符串s’找出来,然后遍历字符串S。进行上面条件的判断。

    bool repeatedSubstringPattern(string s) {int n = s.size();for(int i = 1; i <= n/2; ++i) { //在S的一半长度都没有找到,说明该字符串不符合。if(n % i == 0) { //若字符串S的长度不是当前子字符串长度的整数倍 直接跳过int flag=1; //作为标记是否找到,找到提前返回for(int j = i; j < n; ++j)//i代表着目前的搜索子字符串长度if (s[j] != s[j - i]) {flag=0;break;}if(flag)return 1;}}return 0;}

2.移位
我们已经知道 S=s’s’s’…,那么我们将S中的第一个子字符串s’移到S的最后去,形成的新字符串应该和S是相等的。我们可以通过多次移位得到子字符串。大概过程如下:

例如:S=abcabc
移位一次:cabcab
移位两次:bcabca
移位三次:abcabc

移位第三次得到字符串与S匹配,就可以得到S满足条件,子字符串s’=“abc”

    bool repeatedSubstringPattern(string s) {int n=s.size();string temp;for(int i=1;i<=n/2;i++){ 在S的一半长度都没有找到,说明该字符串不符合。temp=s.substr(i,n-i)+s.substr(0,i);//利用subtr(start,length)函数实现移位的操作if(temp==s)return 1;}return 0;}

这种思路是正确的解题思路之一,不用怀疑这种思路。只是本人写的代码质量不高,虽然也能通过,但是所消耗的内存和运行时间大。看了大佬们的改进,利用了滑动窗户的思想+find内置函数,一行代码直接搞定,任重道远啊。

bool repeatedSubstringPattern(string s) {return (s + s).find(s, 1) != s.size();//(s + s).find(s, 1)返回s.size()说明该字符串不满住}
str1.find(str2,pos) #从str1的第pos个位置起,在字符串str1中寻找字符串str2,返回的是str1在str2中首次出现的位置。

读者可以运行下面的代码加深理解。

 string s="abcd";string ss=s+s; //ss="abcdabcd"cout<<ss.find(s,0);//将0变成1,2,3,4,5试一试

3.KMP算法
先欠着,等学精通了补上。KMP算法

【LeetCode 459 】重复的子字符串相关推荐

  1. 字符串专题-LeetCode:剑指 Offer 58 - II. 左旋转字符串、LeetCode 459.重复的子字符串、 代码思路和注意点

    文章目录 一.剑指 Offer 58 - II. 左旋转字符串 二.LeetCode 459.重复的子字符串 一.剑指 Offer 58 - II. 左旋转字符串 思路: 预留出n个字符空间s.res ...

  2. LeetCode 459. 重复的子字符串(数学)

    1. 题目 给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成.给定的字符串只含有小写英文字母,并且长度不超过10000. 示例 1: 输入: "abab" 输出: T ...

  3. 字符串删除首尾_[LeetCode] 459. 重复的子字符串

    题目链接: https://leetcode-cn.com/problems/repeated-substring-pattern 难度:简单 通过率:42.6% 题目描述: 给定一个非空的字符串,判 ...

  4. leetcode 459. 重复的子字符串(Java版)

    题目 https://leetcode-cn.com/problems/repeated-substring-pattern/ 思路 暴力解法 + 剪枝优化 经过尝试,如果直接使用暴力解法会超时,于是 ...

  5. js实现kmp算法_「leetcode」459.重复的子字符串:KMP算法还能干这个!

    不瞒你说,重复子串问题,KMP很拿手 题目459.重复的子字符串 给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成.给定的字符串只含有小写英文字母,并且长度不超过10000. 示例 1: ...

  6. 算法Day8|字符串专题二 剑指 Offer 58 - II. 左旋转字符串,28. 找出字符串中第一个匹配项的下标,459. 重复的子字符串

    剑指 Offer 58 - II. 左旋转字符串 解题思路: 反转区间为前n的子串 反转区间为n到末尾的子串 反转整个字符串 class Solution {public String reverse ...

  7. 402-字符串(题目:剑指Offer58-II.左旋转字符串、 28. 实现 strStr()、459.重复的子字符串)

    题目:剑指Offer58-II.左旋转字符串 class Solution {public:string reverseLeftWords(string s, int n) {string s1(s. ...

  8. 随想录Day9--28. 实现 strStr() , 459.重复的子字符串

    今天的两道题关键在于学习KMP算法.KMP算法运用场景在于一串字符串里面查找是否含有某个子字符串,如"abcdef"里面就含有"cdf"这么个子字符串.先把题目 ...

  9. 代码随想录Day09:28. 实现 strStr()、459.重复的子字符串、字符串总结 、双指针回顾

    目录 Day09:28. 实现 strStr().459.重复的子字符串.字符串总结 .双指针回顾 28. 实现 strStr() (一刷只看了思想) 459.重复的子字符串 (本题一刷跳过了) 字符 ...

  10. 459. 重复的子字符串-KMP算法

    459. 重复的子字符串 给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成. 示例 1: 输入: s = "abab" 输出: true 解释: 可由子串 & ...

最新文章

  1. CISP人才年薪30W起步优先考虑它
  2. python opencv SIFT,获取特征点的坐标位置
  3. python pytest allure_python测试框架pytest和测试报告allure的联合使用-----测试套件
  4. mysql 增量备份脚本_MySQL自动化(全量+增量)备份脚本
  5. 织梦留言簿使用及修改
  6. Oralce 时间TIMESTAMP的比较
  7. mappedbytebuffer_小师妹学JavaIO之:MappedByteBuffer多大的文件我都装得下
  8. 软件测试之常见性能测试流程
  9. 内网使用 IPV6 之 TunnelBroker隧道(6in4)篇
  10. 分享一款TF/SD卡手机存储卡格式化修复工具
  11. 金蝶K3WISE15.1开启WEBAPI
  12. ros pppoe服务器性能,ROS软路由中最详细的PPPOE服务器设置教程
  13. matlab 模拟滤波器转换为数字滤波器,模拟低通滤波器转换为数字高通滤波器.doc...
  14. 二叉树的前序序列、中序序列、后序序列、层次序列
  15. 农村产权交易平台上线,大力发展村金融经济
  16. 解决Android studio运行代码手机出现xxx keeps stopping
  17. 烟雨PHP图床程序源码
  18. 呃呃,阿里p6学习路线啊
  19. 解决华为虚拟键盘问题
  20. Qt信息隐藏(Q_D/Q_Q)介绍

热门文章

  1. 《变形金刚4》将如期上映 植入广告无孔不入
  2. 物理机连接无线网络的配置
  3. 柠檬汁的人生观-李嘉诚
  4. 红叶倾城一键网页游戏服务端+客户端(无须安装Java)源码
  5. 中国医疗保健分析测试服务行业市场供需与战略研究报告
  6. vue3.0-echarts@5.0 - 旭日图+bar图 实现 小太阳
  7. python中占位符可以用什么_python占位符都有什么
  8. 2021-09-05-数字身份与区块链
  9. 对话框AlertDialog的基本使用(新手)
  10. RDP远程登录 Windows server系统