【算法09天:Day9】第四章字符串 LeetCode 实现strStr()(28)

52 阅读1分钟

题目一:

image.png

解法一:(库函数)

image.png

解法二:(KMP算法)

KMP算法:KMP主要应用在字符串匹配上。

KMP的主要思想是当出现字符串不匹配时,可以知道一部分之前已经匹配的文本内容,可以利用这些信息避免从头再去做匹配了。

前缀表统一不减一:

var strStr = function(haystack, needle) {
    if (needle.length === 0) {
        return 0
    }

    const getNext = (needle) => {
        let j = 0;
        let next = []
        next.push(j)

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

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

具体的KMP算法思想,这里就不再赘述了,请参考代码随想录中的详细讲解,十分清楚!!!

解法三:(暴力解法)

var strStr = function(haystack, needle) {
    const n = haystack.length, m = needle.length;
    for (let i = 0; i + m <= n; i++) {
        let flag = true;
        for (let j = 0; j < m; j++) {
            if (haystack[i + j] != needle[j]) {
                flag = false;
                break;
            }
        }
        if (flag) {
            return i;
        }
    }
    return -1;
};