数据结构与算法每日一题——字符串(459. 重复的子字符串)

57 阅读1分钟

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;
};