开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第36天,点击查看活动详情
题目描述
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。
来源:力扣(LeetCode)
- 示例 1
输入:haystack = "sadbutsad", needle = "sad"
输出:0
解释:"sad" 在下标 0 和 6 处匹配。
第一个匹配项的下标是 0 ,所以返回 0 。
- 示例 2
输入:haystack = "leetcode", needle = "leeto"
输出:-1
解释:"leeto" 没有在 "leetcode" 中出现,所以返回 -1 。
思路分析
根据题意可知,题目给出两个字符串haystack和needle,需要在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标i,并将下标i返回出去。如果 needle 不是 haystack 的一部分,则返回 -1。
对于这种题目,需要从一个字符串里面取出每一个字符去和另一个字符串的每一个字符进行匹配,遇到不能匹配时就将当前的下标i返回出来。
这里有两个字符,所以需要有两层循环。先计算出两个字符的长度haystackLength和needleLength以方便循环操作。第一层循环haystack字符串,这次循环不能超过(haystackLength - needleLength)次,因为在haystack字符串中能被needle字符串匹配上的子字符串长度一定要大于等于needle。第二层循环needle字符串,取两个字符串的相同下标的字符做匹配,若是相同就继续循环匹配,以haystack字符串的第一个字符为开头的子字符串可能不能needle匹配上,这就需要取haystack字符串的第二个字符为开头的字符去匹配,所以在判断的时候用needle[j]和haystack[i+j]来匹配。
AC代码
function solution(haystack, needle) {
const haystackLength = haystack.length;
const needleLength = needle.length;
for(let i=0; i<haystackLength - needleLength; i++) {
let flag = true;
for(let j=0; j<needleLength; j++) {
if(needle[j] != haystack[i+j]) {
flag = false;
break;
}
}
if(flag) {
console.log(i)
return i
}
}
console.log(-1);
return -1;
}
let haystack = "sadbutsad", needle = "sad";
solution(haystack, needle);