本文已参与「新人创作礼」活动,一起开启掘金创作之路。
题目
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。
输入:haystack = "sadbutsad", needle = "sad"
输出:0
解释:"sad" 在下标 0 和 6 处匹配。
第一个匹配项的下标是 0 ,所以返回 0 。
题目解析
思路一
var strStr = function(s, p) {
const sLen = s.length
const pLen = p.length
let pNext = 0 // 匹配串末尾的下一个字符
let i = 0
let j = 0
// 序列化匹配串
let index = 0
const mapping = {}
while (index < pLen) {
mapping[p[index]] = index
index++
}
while (i < sLen && j < pLen) {
if (s[i] === p[j]) {
i++
j++
} else {
// s 和 p 失配
pNext = i - j + pLen
if (mapping[s[pNext]] !== undefined) {
//【匹配串末尾的下一个字符】在匹配串中出现过
i = pNext - mapping[s[pNext]]
} else {
// 不在匹配串中,移动到【匹配串的长度 + 1】个长度
i = pNext + 1
}
j = 0
}
}
return j === pLen ? i - j : -1
};
思路二
我们可以遍历haystack数组,找到与needle第一个字符匹配的位置,在记录当前位置,并从当前位置开始,进一步比较needle剩余的字符,当needle所有的字符都匹配上时,返回记录的位置;一旦有某个字符没有匹配上,直接break,跳出本次比较
/**
* @param {string} haystack
* @param {string} needle
* @return {number}
*/
var strStr = function(haystack, needle) {
if(needle.length === 0){
return 0;
}
let res = -1;
for(let i=0;i<haystack.length;i++){
if(needle.charAt(0) === haystack.charAt(i)){
let j = 0;
let index =i;
let temp = i;
while(j<needle.length && index<haystack.length){
if(needle.charAt(j) === haystack.charAt(index)){
j++;
index++;
if(j===needle.length){
res = temp;
return res;
}
}else{
break;
}
}
}
}
return res;
};
思路三
首先返回haystack === needle === ''的情况,然后通过循环haystack截取长度等于needle.length的字符串,依次放入数组,通过indexOf判断needle在arr是否存在。
/**
* @param {string} haystack
* @param {string} needle
* @return {number}
*/
var strStr = function(haystack, needle) {
if(haystack.length === 0 && needle.length === 0){
return 0
}else{
let arr = []
for(let i = 0 ; i < haystack.length ; i++){
arr.push(haystack.substr(i,needle.length))
}
return arr.indexOf(needle)
}
};