实现strStr()

一般的字符串匹配问题我们可以使用KMP算法来处理,当我们搜索文本串和模式串是否匹配的时候,我们先得到模式串的一个前缀表,其中前缀表中存放的内容是模式串的最长相等前后缀。例如文本串为:aabaabaafa,模式串为:aabaaf,那么文本串的前缀表就是010120。当我们开始搜索时,我们发现在模式串f字符不匹配,我们就f前缀表中前一个字符的前缀表中的数值,发现是2,那么我们就跳到模式串下标为2的字符,继续遍历字符串。对于aabaaf来说,在f处不匹配,就是最长相等后缀aa后面的一个字符f不匹配,那么我就可以跳到最长相等前缀aa后面的一个字符b来重新进行匹配,此时前缀表中记录的最长相等前后缀的长度就是这个字符串b的下标。我们首先需要先得到这个前缀表。

class Solution {
public://得到模式串needle的前缀表void getNext(int* next,string& s){int j = 0;//用j来表示最长前缀,但是同时j也表示最长前后缀的值next[0] = j;for(int i = 1;i < s.size();i++)//用i来表示最长后缀{while(j > 0 && s[i] != s[j])//前缀、后缀不相等的情况{j = next[j - 1];}if(s[i] == s[j])//前缀、后缀相等的情况{j++;}next[i] = j;//前后缀相等时,更新next[i]为j++的数值;不相等时,更新为next[i]为回退后的数组}}int strStr(string haystack, string needle) //haystack是文本串,needle是模式串{int next[needle.size()];//创建一个数组用来存放前缀表的内容getNext(next,needle);//得到前缀表int j = 0;for(int i = 0;i < haystack.size();i++)//用i来遍历文本串{while(j > 0 && haystack[i] != needle[j]){j = next[j - 1];//j回退到j-1所对应的下标处}if(haystack[i] == needle[j]){j++;}if(j == needle.size()){return (i - needle.size() + 1);}}return -1;}
};

重复的子字符

这道题的思路有两种,第一个思路就是用两个字符串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; // rreturn false;}
};

其中,对于t.find(s) != std::string::npos,npos可以表示string的结束位置,意思就是说如果在字符串t中找不到字符串s,就会返回nops。这是npos的一个用法。

这道题的另一种解法就是KMP算法。这里直接给出结论,数组长度剪去最长相等前后缀的长度就是第一个周期的长度,如果这个的长度可以被整除,那就说明整个数组是这个周期的循环。

class Solution {
public://得到前缀表void getNext(string& s,int* next){int j = 0;//最长前缀next[0] = 0;for(int i = 1;i < s.size();i++){while(j > 0 && s[i] != s[j]){j = next[j-1];}if(s[i] == s[j]){j++;}next[i] = j;}}bool repeatedSubstringPattern(string s) {int next[s.size()];getNext(s,next);int len = s.size();if(next[len-1] != 0 && len % (len - (next[len - 1]))== 0){return true;}return false;}
};

代码随想录day9|实现strStr()、重复的子字符串相关推荐

  1. 【代码随想录二刷】day9 | 28. 实现 strStr() 459.重复的子字符串

    二刷主要记录理解不一样的题 一刷地址:day9 今日题目:中等 KMP:困难 => 第一时间想到了使用KMP,但是不太会,只有用常规方法完成 实现 strStr():拼接完两个字符串s之后,取其 ...

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

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

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

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

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

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

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

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

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

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

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

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

  8. 字符串7——重复的子字符串

    字符串7--重复的子字符串 例题 题目链接 题目说明 解题 方法一:枚举 思路与算法 代码 复杂度分析 方法二:字符串匹配 思路与算法 代码 复杂度分析 方法三:KMP 算法 思路与算法 代码 复杂度 ...

  9. 【字符串】leet459.重复的子字符串(C/C++/Java/Python/Js)

    leetcode459.重复的子字符串 1 题目 2 思路 3 代码 3.1 C++版本 3.2 C版本 3.3 Java版本 3.4 Python版本 3.5 JavaScript版本 4 总结 K ...

  10. [字符串]重复的子字符串

    一.题目描述 原文链接:459. 重复的子字符串 具体描述: 给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成. 示例 1: 输入: s = "abab" 输 ...

最新文章

  1. 使用MS VS的命令来编译C++程序
  2. [UWP]在应用开发中安全使用文件资源
  3. 并发锁之二:ReentrantReadWriteLock读写锁
  4. sqlserver存储过程入门之 游标
  5. mysql ado.net 实体数据模型_Visual Studio2017中如何让Entity Framework工具【ADO.NET实体数据模型】支持MYSQL数据源...
  6. STL 源码剖析 heap堆
  7. 移动电商营销吸睛法宝----图标、标签
  8. [Angular 2] Using events and refs
  9. 思维导图哪款好用?怎么借助MindManager 做旅游计划
  10. SecureCRT的安装、介绍、简单操作
  11. oracle 密码过期 ora-01017,Oracle密码过期, 报:ORA-01017: 用户名/口令无效; 登录被拒绝...
  12. 2020年数学建模国赛E题题目和解题思路
  13. 软件开发公司能开发哪些类型的app软件
  14. 环洋市场咨询:全球OLED收入预计2028年达到502.4亿美元
  15. java poi操作word模版 导出word文档(附工具类)
  16. 登入拼多多显示服务器请求失败,拼多多商家后台登录打不开?
  17. POI导出EXCEL附带二维码以及条形码
  18. 首师大的计算机专业,首都师范大学计算机技术考研难吗
  19. P4844 LJJ爱数数
  20. Mac下python+selenium【2】获取表格所有元素

热门文章

  1. BZOJ 2820 YY的GCD(莫比乌斯反演)
  2. 别把世界和好男人,都让给绿茶婊
  3. 【English】Healthy at 100 !!
  4. 微信号复制跟跳转——clipboard.js
  5. 想考个PMP证书怎么报考啊?
  6. 青岛开发区中学计算机竞赛,五大学科竞赛成绩分析,我们差距在哪里
  7. BMG5100千兆5G智能杆网关
  8. 吴裕雄--天生自然 中医研究学习:入门
  9. 研究生毕业在杭州落户
  10. 微信分享网页链接自定义标题,图片,文字描述