459. 重复的子字符串
js
;(function () {
/**
* 459. 重复的子字符串
* 给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。
*
* 输入: s = "abab"
* 输出: true
* 解释: 可由子串 "ab" 重复两次构成。
*
* 输入: s = "aba"
* 输出: false
*
* 输入: s = "abcabcabcabc"
* 输出: true
* 解释: 可由子串 "abc" 重复四次构成。 (或子串 "abcabc" 重复两次构成。)
*
*/
function repeatedSubstringPattern(s: string): boolean {
// 方法一: -------------- 耗时太长 -------------------------
// let len = s.length;
// // 重复:则表示至少有2个子串,遍历时不能超过总长度的一半
// let mid = Math.ceil(len / 2);
// // 长度小于2肯定不满足条件,直接返回false
// if (len < 2) return false;
// // 遍历:如果以当前字符全局替换【s】为空字符串,返回的结果为空,则表示满足条件
// for (let i = 1; i <= mid; i++) {
// let curStr = s.substring(0, i);
// let replaceRes = s.replace(new RegExp(curStr, 'g'), '')
// if (!replaceRes) {
// return true;
// }
// }
// return false
// 方法二:
let len = s.length
// 重复:则表示至少有2个子串,遍历时不能超过总长度的一半
let mid = Math.ceil(len / 2)
// 长度小于2肯定不满足条件,直接返回false
if (len < 2) return false
// 遍历:
for (let i = 1; i <= mid; i++) {
let curStr = s.substring(0, i)
let repeatNum = Math.floor(len / curStr.length)
if (curStr.repeat(repeatNum) === s) {
return true
}
}
return false
}
const s1 = 'abab'
const s2 = 'aba'
const s3 = 'abcabcabcabc'
const s4 = 'babbabbabbabbab'
console.log(repeatedSubstringPattern(s1))
console.log(repeatedSubstringPattern(s2))
console.log(repeatedSubstringPattern(s3))
console.log(repeatedSubstringPattern(s4))
})()