【笔记】JavaScript版数据结构与算法——基础算法之“正则类”(459. 重复的子字符串)
2023-09-27 14:26:51 时间
重复的子字符串
1.题目
给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。
示例 1:
输入: “abab”
输出: True
解释: 可由子字符串 “ab” 重复两次构成。
示例 2:
输入: “aba”
输出: False
示例 3:
输入: “abcabcabcabc”
输出: True
解释: 可由子字符串 “abc” 重复四次构成。 (或者子字符串 “abcabc” 重复两次构成。)
题目模板
/**
* @param {string} s
* @return {boolean}
*/
var repeatedSubstringPattern = function(s) {
};
2.思路分析
见题解
3.所用到的方法
代码 | 说明 |
---|---|
. | 匹配除换行符以外的任意字符 |
\w | 匹配字母或数字或下划线 |
\s | 匹配任意的空白符 |
\d | 匹配数字 |
\b | 匹配单词的开始或结束 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
* | 重复零次或更多次 |
+ | 重复一次或更多次 |
? | 重复零次或一次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n到m次 |
\W | 匹配任意不是字母,数字,下划线,汉字的字符 |
\S | 匹配任意不是空白符的字符 |
\D | 匹配任意非数字的字符 |
\B | 匹配不是单词开头或结束的位置 |
[^x] | 匹配除了x以外的任意字符 |
[^aeiou] | 匹配除了aeiou这几个字母以外的任意字符 |
4.题解及优化
课程解法
var repeatedSubstringPattern = function (s) {
return /^(\w+)\1+$/.test(s)
}
- ^:正则匹配开始
- (\w+)
-
- ():小括号表示捕获并记住
- \w:匹配字母或数字或下划线
- +:匹配多次
- \1+:返回最后的第1+个子捕获匹配的子字符串(捕获的数目以左括号计数)
- $:正则匹配结束
其他小伙伴的解法
字符串includes
假设字符串由 n 个相同子串组成, 重复、掐头去尾后包含子串 2n - 2, 如果仍然包含原字符串即 2n - 2 > n,那就表示 n > 2
var repeatedSubstringPattern = function(s) {
return (s + s).slice(1, -1).includes(s)
}
周期解法
周期串为s, 那么设定t表示最小周期, 数学中周期的表达式是
f(x+t)=f(x)
字符串中 s = item * count
那么我们需要找到最小周期 t = item.length
var repeatedSubstringPattern = function(s) {
let len = s.length
let i = 1
while (i <= len / 2) {
if (len % i === 0 && s.slice(0, i).repeat(len / i) === s) {
return true
}
i++
}
return false
};
相关文章
- JavaScript--> JavaScript reference--> Statements and declarations--> import
- JavaScript日期函数汇集12个(转载)
- 关于JavaScript中的Hoisting变量提升(MDN社区)
- 详解JavaScript中的this
- JavaScript 编写规范
- 【JavaScript】关于delete
- javascript performance
- FusionCharts JavaScript API - Events 全局事件处理
- 3.后端学习JavaScript
- 写给Javascript初学者的小小建议
- 浅析JavaScript中变量存储在堆中还是栈中-字符串、数字、其他类型分别是怎样存储的:984k的栈区为啥能装几十M的字符串、V8对字符串的处理过程(存在则复用地址,不存在则新建内存后把地址赋给变量/字符串不可变的理解)、数字(小整数在栈,其他在堆)、其他基本类型(引擎初始化时分配地址,之后都是复用同一个地址)
- 华为OD机试 - 机器人走迷宫(JavaScript) | 机试题+算法思路+考点+代码解析 【2023】
- 华为OD机试 - 快递货车(JavaScript) | 机试题+算法思路+考点+代码解析 【2023】
- 华为OD机试 - 叠放书籍(JavaScript) | 机试题+算法思路+考点+代码解析 【2023】
- 华为OD机试 - TLV编码(JavaScript) | 机试题+算法思路+考点+代码解析 【2023】
- 华为OD机试 - 数组编写函数(JavaScript) | 机试题+算法思路+考点+代码解析 【2023】
- 华为OD机试 - 选座位(JavaScript) | 机试题+算法思路+考点+代码解析 【2023】
- 华为OD机试 -满足规则的数组组合(JavaScript) | 机试题+算法思路+考点+代码解析 【2023】
- 华为OD机试 - 符合条件的子串长度(JavaScript) | 机试题+算法思路+考点+代码解析 【2023】
- 华为OD机试 - 乘积最大值(JavaScript) | 机试题+算法思路+考点+代码解析 【2023】
- 华为OD机试 - 交换字符(JavaScript) | 机试题+算法思路+考点+代码解析 【2023】
- 华为OD机试 - 水仙花数2(JavaScript) | 机试题+算法思路+考点+代码解析 【2023】
- 华为OD机试 - 敏感字段加密(JavaScript) | 机试题+算法思路+考点+代码解析 【2023】
- 华为OD机试 - 找字符(JavaScript) | 机试题+算法思路+考点+代码解析 【2023】
- 华为OD机试 - 众数和中位数(JavaScript) | 机试题+算法思路+考点+代码解析 【2023】
- javascript奇技淫巧之位运算符
- JavaScript原型和继承
- 数据交换格式(XML与JSON)、JSON与JavaScript对象之间互转
- JavaScript图片库