Leetcode 459.重复的子字符串
题目:459.重复的子字符串
初始思路
如果可以由子串构成的话,重复次数至少为2,那么前后一定是相同的。感觉跟KMP算法的最长相等前缀有类似的地方。
代码
// 常规解法
var repeatedSubstringPattern = function (s) {
// 1. 设置 s 的长度 length
const length = s.length;
if (length === 0) return false
// 2. 设置每次累加的长度
let str = '';
// 3. 遍历字符串 子串可能不会超过原字符串的一半
for (let i = 0; i < Math.floor(length / 2); i++) {
// 3.1 累加字符串
str += s[i];
// 3.2 判断是否为重复的长度
// 使用了ES6的一个函数
if (s === str.repeat(Math.floor(length / str.length))) {
return true;
}
}
// 4. 如果不存在,则返回 false
return false;
};
// KMP解法
var repeatedSubstringPattern = function (s) {
if (s.length === 0)
return false;
const getNext = (s) => {
let next = [];
let j = 0;
next.push(j);
for (let i = 1; i < s.length; ++i) {
while (j > 0 && s[i] !== s[j])
j = next[j - 1];
if (s[i] === s[j])
j++;
next.push(j);
}
return next;
}
let next = getNext(s);
if (next[next.length - 1] !== 0 && s.length % (s.length - next[next.length - 1]) === 0)
return true;
return false;
};