JS 实现 KMP 算法

在做 leetcode 28 implement strStr()的时候,要写一个 KMP 算法。 参考了Youtube的一个视频和阮一峰的KMP算法简介。

主要是要把prefixArray给生成,然后在匹配,达到一个线性事件复杂度。

function findStr(text, pattern) {

    function getPrefixArray(pattern) {
        let i = 0
        let j = 1
        let result = new Array(pattern.length).fill(0)
        while (j < pattern.length) {
            if (pattern[i] == pattern[j]) {
                result[j] = i + 1
                i++
            } else {
                while (i > 0) {
                    i = result[i - 1]
                    if (pattern[i] == pattern[j]) {
                        i++
                        break
                    }
                }
                result[j] = i == 0 ? 0 : i + 1
            }
            j++
        }
        return result
    }

    function kmp(pattern, text) {
        const prefixArray = getPrefixArray(pattern)
        let index = 0
        let alreadyMatched = 0
        while (index < text.length) {
            if (alreadyMatched == pattern.length) {
                return index
            }
            else if (pattern[alreadyMatched] == text[index + alreadyMatched]) {
                //console.log("match a char", index)
                alreadyMatched += 1
            }
            else {
                if (alreadyMatched == 0) {
                    index += 1
                }
                else {
                    let move = alreadyMatched - prefixArray[alreadyMatched - 1]
                    index += move
                }
                alreadyMatched = 0
            }
        }
        return -1
    }
    if (!text && !pattern) {
        return 0
    }
    return kmp(pattern, text)
};