代码随想录| 数组 part02| KMP算法

77 阅读1分钟

28. 找出字符串中第一个匹配项的下标

var strStr = function(haystack, needle) {
    let next = getNext(needle)
    console.log(next)
    let i = 0
    let j = 0
    while(i<haystack.length){
        if(haystack[i]==needle[j]){
            i++
            j++
        }else if(haystack[i]!=needle[j] && j>0){
            j = next[j-1]
        }else{
            i++
        }

        if(j==needle.length){
            return i-j
        }
    }

    return -1
};

function getNext(str){
    let next = [0]  // 初始化非常重要
    let cur = 0
    let i = 1
    while(i<str.length){
        if(str[cur] === str[i]){
            cur+=1
            next.push(cur)
            i++
        }else if(str[cur] !== str[i]&&cur==0){
            next.push(cur)
            i++
        }else{
            cur = next[cur-1]
        }
    }
        
    return next
}
var repeatedSubstringPattern = function (s) {
    if (s.length === 0)
        return false;

    const getNext = (s) => {
        let next = [];
        let j = 0;

        next.push(j);

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

        return next;
    }

    let next = getNext(s);

    if (next[next.length - 1] !== 0 && s.length % (s.length - next[next.length - 1]) === 0)
        return true;
    return false;
};