459. 重複的子字符串 next數組

459. 重複的子字符串

給定一個非空的字符串,判斷它是否可以由它的一個子串重複多次構成。給定的字符串只含有小寫英文字母,並且長度不超過10000。

輸入: "abab"
輸出: True
解釋: 可由子字符串 "ab" 重複兩次構成。

題解

next數組每一個值代表除當前點的最長公共前後綴長度-1的值,若符合條件,最後一個next值就是倒數第二個重複子串的尾巴的索引,例如abcdabcdabcdabcd最後一個next值等於11,也就是倒數第二個d的索引,通過這個索引求出重複子串長度15-11=4,再比較前4個字母和後4個字母是否相等即可判斷

/**
 * @param {string} s
 * @return {boolean}
 */
function getNext(str) {
    let i = 0, j = -1, next = [-1];
    while (i < str.length) {
        if (j === -1 || str[i] === str[j]) {
            next[++i] = ++j;
        } else {
            j = next[j];
        }
    }
    return next;
}
var repeatedSubstringPattern = function (s) {
    //排除長度爲1的情況
    if (s.length === 1) return false;
    // 獲取next數組
    let next = getNext(s);
    //重複子串的長度
    let len = s.length - 1 - next[s.length - 1]; console.log(next[s.length - 1])
    /* 前len和後len個相等 */
    return s.slice(0, len) === s.slice(-len);//abcd abcd
};
console.log(repeatedSubstringPattern("abcdabcdabcdabcd"))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章