js实现kmp算法_「leetcode」459.重复的子字符串:KMP算法还能干这个!
不瞒你说,重复子串问题,KMP很拿手
题目459.重复的子字符串
给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。
示例 1:
输入: "abab"
输出: True
解释: 可由子字符串 "ab" 重复两次构成。
示例 2:
输入: "aba"
输出: False
示例 3:
输入: "abcabcabcabc"
输出: True
解释: 可由子字符串 "abc" 重复四次构成。(或者子字符串 "abcabc" 重复两次构成。)
思路
这又是一道标准的KMP的题目。
我们在字符串:都来看看KMP的看家本领!里提到了,在一个串中查找是否出现过另一个串,这是KMP的看家本领。
那么寻找重复子串怎么也涉及到KMP算法了呢?
这里就要说一说next数组了,next 数组记录的就是最长相同前后缀( 字符串:听说你对KMP有这些疑问? 这里介绍了什么是前缀,什么是后缀,什么又是最长相同前后缀), 如果 next[len - 1] != -1,则说明字符串有最长相同的前后缀(就是字符串里的前缀子串和后缀子串相同的最长长度)。
最长相等前后缀的长度为:next[len - 1] + 1。
数组长度为:len。
如果len % (len - (next[len - 1] + 1)) == 0 ,则说明 (数组长度-最长相等前后缀的长度) 正好可以被 数组的长度整除,说明有该字符串有重复的子字符串。
「强烈建议大家把next数组打印出来,看看next数组里的规律,有助于理解KMP算法」
如图:
此时next[len - 1] = 7,next[len - 1] + 1 = 8,8就是此时 字符串asdfasdfasdf的最长相同前后缀的长度。
(len - (next[len - 1] + 1)) 也就是:12(字符串的长度) - 8(最长公共前后缀的长度) = 4, 4正好可以被 12(字符串的长度) 整除,所以说明有重复的子字符串(asdf)。
代码如下:
C++代码
class Solution {
public:// KMP里标准构建next数组的过程void getNext (int* next, const string& s){next[0] = -1;int j = -1;for(int i = 1;i < s.size(); i++){while(j >= 0 && s[i] != s[j+1]) {j = next[j];}if(s[i] == s[j+1]) {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] != -1 && len % (len - (next[len - 1] + 1)) == 0) {return true;}return false;}
};
拓展
此时我们已经分享了三篇KMP的文章,首先是字符串:KMP是时候上场了(一文读懂系列)讲解KMP算法的基础理论,给出next数组究竟是如何来了,前缀表又是怎么回事,为什么要选择前缀表。
然后通过字符串:都来看看KMP的看家本领!讲解一道KMP的经典题目,判断文本串里是否出现过模式串,这里涉及到构造next数组的代码实现,以及使用next数组完成模式串与文本串的匹配过程。
后来很多同学反馈说:搞不懂前后缀,什么又是最长相同前后缀(最长公共前后缀我认为这个用词不准确),以及为什么前缀表要统一减一(右移)呢,不减一行不行?针对这些问题,我在字符串:听说你对KMP有这些疑问?中又给出了详细的讲解。
本文:
https://github.com/youngyangyang04/leetcode-mastergithub.com
已经收录,里面还有leetcode刷题攻略、各个类型经典题目刷题顺序、思维导图,可以fork到自己仓库,有空看一看一定会有所收获,如果对你有帮助也给一个star支持一下吧! 我的B站(里面有我讲解的算法视频已经编程相关知识):
哔哩哔哩 ( ゜- ゜)つロ 乾杯~ Bilibilispace.bilibili.com
我是程序员Carl,哈工大师兄,先后在腾讯和百度从事技术研发多年,利用工作之余重刷leetcode,更多精彩算法文章尽在:代码随想录,关注后,回复「Java」「C++」「python」「简历模板」等等,有我整理多年的学习资料,可以加我微信,备注「个人简介」+「组队刷题」,拉你进入刷题群(无任何广告,纯个人分享),每天一道经典题目分析,我选的每一道题目都不是孤立的,而是由浅入深一脉相承的,如果跟住节奏每篇连续着看,定会融会贯通。
js实现kmp算法_「leetcode」459.重复的子字符串:KMP算法还能干这个!相关推荐
- 459. 重复的子字符串-KMP算法
459. 重复的子字符串 给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成. 示例 1: 输入: s = "abab" 输出: true 解释: 可由子串 & ...
- admm算法_「优化」交替方向乘子法(ADMM)的基本原理
编者按:本文介绍ADMM最基本情形的推导.通过这篇文章,你将了解ADMM算法的基本思路,收敛性分析的基本原理,和它理论上的一些局限性. 文章作者:覃含章 责任编辑:覃含章 本文的内容主要来自著名的讲义 ...
- 算法Day8|字符串专题二 剑指 Offer 58 - II. 左旋转字符串,28. 找出字符串中第一个匹配项的下标,459. 重复的子字符串
剑指 Offer 58 - II. 左旋转字符串 解题思路: 反转区间为前n的子串 反转区间为n到末尾的子串 反转整个字符串 class Solution {public String reverse ...
- 字符串专题-LeetCode:剑指 Offer 58 - II. 左旋转字符串、LeetCode 459.重复的子字符串、 代码思路和注意点
文章目录 一.剑指 Offer 58 - II. 左旋转字符串 二.LeetCode 459.重复的子字符串 一.剑指 Offer 58 - II. 左旋转字符串 思路: 预留出n个字符空间s.res ...
- 消除左递归实验代码_「leetcode」108. 构造二叉搜索树【递归】【迭代】详解!
构造二叉搜索树,一不小心就平衡了 ❞ 108.将有序数组转换为二叉搜索树 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树 ...
- 消除左递归c++代码_「leetcode」129. 求根到叶子节点数字之和【递归中隐藏着回溯】详解...
链接 https://leetcode-cn.com/problems/sum-root-to-leaf-numbers/ 思路 本题和113.路径总和II是类似的思路,做完这道题,可以顺便把113. ...
- 二维数组删除_「leetcode」数组:总结篇!(一文搞懂数组题目)
数组理论基础 数组是非常基础的数据结构,在面试中,考察数组的题目一般在思维上都不难,主要是考察对代码的掌控能力 也就是说,想法很简单,但实现起来 可能就不是那么回事了. 首先要知道数组在内存中的存储方 ...
- 消除左递归实验代码_「leetcode」669. 修剪二叉搜索树:【递归】【迭代】详解!
单纯移除一个节点那还不够,要修剪! ❞ 669. 修剪二叉搜索树 题目链接:https://leetcode-cn.com/problems/trim-a-binary-search-tree/ 给定 ...
- js最小化浏览器_「译」解析、抽象语法树(ast) +如何最小化解析时间的5个技巧...
前言 该系列课程会在本周陆续更新完毕,主要讲解的都是工作中可能会遇到的真实开发中比较重要的问题以及相应的解决方法.通过本系列的课程学习,希望能对你日常的工作带来些许变化.当然,欢迎大家关注我,我将持续 ...
最新文章
- 常用的Percona-Toolkit工具
- 数据库为何不建议部署在Docker容器内
- 新版 apache_2.0.54 php-5.0.4 mysql-4.1.12a 组合安装向导(原创)
- 经常使用的MySQL语句整理
- C语言结构体描述BMP的文件格式
- RuiJi Scraper基础 – RuiJi表达式模型
- arcgis server缓存路径修改
- 使用行为树(Behavior Tree)实现游戏AI
- 硬币支付问题(贪心策略)
- hadoop的几个常用命令
- 在OpenCV中使用YOLO v3进行物体检测
- SQLServer 数据库之锁
- MATLAB 如何导入.txt文本
- win10电脑显示未安装任何音频输出设备问题解决记录
- MATLAB安装摄像头插件
- 大数据之足球盘口赔率凯利必发数据采集爬虫
- sandboxie游戏不能运行在虚拟环境中如何解决_Mac系统运行“exe”文件最简单的解决办法...
- Android 类似未读短信图标显示数字效果的分析
- Kahan's Summation Formula原理—它是如何处理大数吃小数的
- canvas压缩图片或者进行视频抓拍