代码随想录的第八天

58 阅读1分钟

代码随想录的第八天

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

暴力匹配

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

KMP算法:

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

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

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

思路:理论看懂了,算法没懂,后续回来补充

459. 重复的子字符串

暴力解法:

var repeatedSubstringPattern = function(s) {
    let sum = ''
    for (let i = 0; i < s.length - 1; i++) {
        sum += s[i]
        if (s === sum.repeat(Math.floor(s.length/ sum.length))) {
            return true
        }
    }
    return false
};

思路:

1、定义一个字符串用来存放最小的重复字符串

2、这个字符串是否能完全重复

KMP算法:

后续理解完成后更新