Leetcode 459.重复的子字符串
题目:459.重复的子字符串
初始思路
如果可以由子串构成的话,重复次数至少为2,那么前后一定是相同的。感觉跟KMP算法的最长相等前缀有类似的地方。
代码
// 常规解法var repeatedSubstringPattern = function (s) {// 1. 设置 s 的长度 lengthconst 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. 如果不存在,则返回 falsereturn 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;};
