Skip to content

重复的子字符串

js
// 给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。
//
// 示例 1:
// 输入: "abab"
// 输出: True
// 解释: 可由子字符串 "ab" 重复两次构成。
//
// 示例 2:
// 输入: "aba"
// 输出: False
//
// 示例 3:
// 输入: "abcabcabcabc"
// 输出: True
// 解释: 可由子字符串 "abc" 重复四次构成。 (或者子字符串 "abcabc" 重复两次构成。)

function fn1(s) {
    // 思路:字符串与本身拼接,删除第一个和最后一个,如果还包含该字符串,那么它是否可以由它的一个子串重复多次构成
    let ss = s + s;
    ss = ss.slice(1,ss.length-1);
    return ss.includes(s);
}

// console.log(fn1("abab"));
// console.log(fn1("aba"));
// console.log(fn1("abcabcabcabc"));

function fn2(s){
    // 通过KMP获取前缀表
    const next = getNext(s);
    const len = next.length;
    // 如果前缀表最后一个元素不等于0 和 字符串长度取模字符串长度-最长相同前后缀 等于0 那么它是否可以由它的一个子串重复多次构成
    return next[len-1] !== 0 && s.length % (s.length - next[len - 1]) === 0;
}

function getNext(s){
    let j = 0;
    const next = [0];
    for(let i = 1; i<s.length;i++){
        while (j>0 && s[j] !== s[i]) j = next[j-1];
        if(s[j] === s[i]) j++;
        next[i] = j;
    }
    return next;
}

console.log(fn2("abab"));
console.log(fn2("aba"));
console.log(fn2("abcabcabcabc"));
console.log(fn2("abcabcabcefg"));
// 给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。
//
// 示例 1:
// 输入: "abab"
// 输出: True
// 解释: 可由子字符串 "ab" 重复两次构成。
//
// 示例 2:
// 输入: "aba"
// 输出: False
//
// 示例 3:
// 输入: "abcabcabcabc"
// 输出: True
// 解释: 可由子字符串 "abc" 重复四次构成。 (或者子字符串 "abcabc" 重复两次构成。)

function fn1(s) {
    // 思路:字符串与本身拼接,删除第一个和最后一个,如果还包含该字符串,那么它是否可以由它的一个子串重复多次构成
    let ss = s + s;
    ss = ss.slice(1,ss.length-1);
    return ss.includes(s);
}

// console.log(fn1("abab"));
// console.log(fn1("aba"));
// console.log(fn1("abcabcabcabc"));

function fn2(s){
    // 通过KMP获取前缀表
    const next = getNext(s);
    const len = next.length;
    // 如果前缀表最后一个元素不等于0 和 字符串长度取模字符串长度-最长相同前后缀 等于0 那么它是否可以由它的一个子串重复多次构成
    return next[len-1] !== 0 && s.length % (s.length - next[len - 1]) === 0;
}

function getNext(s){
    let j = 0;
    const next = [0];
    for(let i = 1; i<s.length;i++){
        while (j>0 && s[j] !== s[i]) j = next[j-1];
        if(s[j] === s[i]) j++;
        next[i] = j;
    }
    return next;
}

console.log(fn2("abab"));
console.log(fn2("aba"));
console.log(fn2("abcabcabcabc"));
console.log(fn2("abcabcabcefg"));