459. 重复的子字符串](leetcode.cn/problems/re…)
/**
* @param {string} s
* @return {boolean}
*/
// var repeatedSubstringPattern = function(s) {
// // 遍历每个字符,看看当前长度能否被当期字符串整除,如果可以则使用当前字符串重复n次,看是否和原字符串相等即可
// const sArr = s.split('');
// const len = sArr.length;
// return sArr.some((char, index)=>{
// // 表示当前的索引可被长度整除。
// if(len%(index+1) == 0 && index < len-1){
// const count = len/(index+1);
// const baseStr = sArr.slice(0, index+1).join('');
// return baseStr.repeat(count) === s
// }
// })
// };
// 滑动的窗口,这个窗口是不断的变化的,但窗口有一个边界的条件,那就是窗口的最大宽度不能操作字符串的一半。因为字符串是由子字符串组成,重复的次数至少为2。
// 开始设置窗口的宽度为step,初始值为1,将该窗口的重复 len / step 次,这里用到的ES6的新方法repeat(表示将该字符重复多少次),如果不满足,则将step++,同时更新子字符串,不断循环,直到达到边界条件,如果仍不满足,直接返回 false。
/**
* @param {string} s
* @return {boolean}
*/
// var repeatedSubstringPattern = function(s) {
// let len = s.length;
// let step = 1;
// let initStr = s.substring(0, step);
// while(step <= len / 2) {
// if(initStr.repeat(len / step) === s) {
// return true;
// }
// step++;
// initStr = s.substring(0, step);
// }
// return false;
// };
// 1、如果一个字符串可以由它的一个子串重复多次构成,那么必定这个子串是原字符串的约数;
// 2、且这个子串重复一定次数后等于原串;
/**
* @param {string} s
* @return {boolean}
*/
var repeatedSubstringPattern = function (s) {
const n = s.length;
for (let i = 1; i < n; i++) {
let substr = s.substr(0, i);
if (n % substr.length === 0) {
let repeat = n / substr.length;
if (substr.repeat(repeat) === s) {
return true;
}
}
}
return false;
};