在力扣里面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算法核心是前缀函数,然后就先去学习啥是前缀函数,前缀函数看完了,看官解的代码,还没有完全捋明白,但是,想着既然想要坚持刷题,并且回顾复习,那就不要半途而废。不管咋样先把流水账记录上,等我把官解代码撸明白了再来补充。
也不知道能坚持多久,间歇性焦虑中~(用我茜茜的美貌镇住)