03力扣(简单题)KMP

98 阅读2分钟

在力扣里面KMP也是简单题了...

今日练习题:(28)找出字符串中第一个匹配的下标

题目内容:给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回  -1

练习语言:JavaScript

独立完成的暴力匹配:58ms

var strStr = function(haystack, needle) {
    const num = haystack.length - needle.length + 1 > 0 ? haystack.length - needle.length + 1 : 0
    for (let i = 0; i < num; i++) {
        for (let j = 0; j < needle.length; j++) {
            if (needle[j] !== haystack[i + j]) break
            if (j == needle.length - 1) return i
        }
    }
    return -1
};

脑袋里面没有算法,遇到这种问题想到的只有for循环,就是暴力匹配,挨着挨着去对比,找出符合条件的子串。

两个for循环,唯一做了点文章的地方就是外层循环的次数,可以不用将原串循环完,只要剩余长度小于匹配串长度以后就可以停止匹配了。内层循环写了两个判断条件,一个是在匹配过程中出现不匹配的条件了,就跳出本次循环,一个是当本次完全匹配上了就终止循环。

和官解的差别不大,官解用了一个标识去辅助判断。以下是官解:

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;
};

官方给出的第二个方法是KMP算法

说实话,感觉大学学过,忘完求。拿着好懵...

KMP算法核心是前缀函数,然后就先去学习啥是前缀函数,前缀函数看完了,看官解的代码,还没有完全捋明白,但是,想着既然想要坚持刷题,并且回顾复习,那就不要半途而废。不管咋样先把流水账记录上,等我把官解代码撸明白了再来补充。

也不知道能坚持多久,间歇性焦虑中~(用我茜茜的美貌镇住)