题目描述
给你两个字符串 haystack
和 needle
,请你在 haystack
字符串中找出 needle
字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle
不是 haystack
的一部分,则返回 -1
。
示例 1:
输入:haystack = "sadbutsad", needle = "sad"
输出:0
解释:"sad
" 在下标 0
和 6
处匹配。第一个匹配项的下标是 0
,所以返回 0
。
示例 2:
输入:haystack = "leetcode", needle = "leeto"
输出:-1
解释:"leeto"
没有在 "leetcode"
中出现,所以返回 -1
。
解题
最简单的解法,但是面试的时候面试官可能会不让用这种方法
直接利用JavaScript
自带的indexOf
实现
javascript
/**
* @param {string} haystack
* @param {string} needle
* @return {number}
*/
var strStr = function(haystack, needle) {
return haystack.indexOf(needle)
};
第二种解法
双层for循环嵌套,当首位匹配时,循环检查后几位是否相同。
javascript
/**
* @param {string} haystack
* @param {string} needle
* @return {number}
*/
var strStr = function(haystack, needle){
if (needle==="") return 0
for(var i=0;i<haystack.length;i++){
if(haystack[i]===needle[0]){
var flag = true;
for (var j=1;j<needle.length;j++){
if (haystack[i+j]!=needle[j]){
flag = false
break;
}
}
if (flag) return i
}
}
return -1
};
下面是这段代码的逻辑分析:
-
首先,函数
strStr
接收两个参数:haystack
和needle
。 -
如果
needle
是一个空字符串,根据题意,应该返回0
,因为空字符串被认为是在任何字符串的任何位置都匹配的。 -
接下来,函数使用一个
for
循环遍历haystack
中的每个字符。循环变量i
从0
开始,直到haystack
的长度。 -
在循环内部,首先检查
haystack
中当前索引i
处的字符是否与needle
的第一个字符相等。如果是,那么进入下一个判断。 -
如果当前字符匹配,函数会尝试检查
needle
的剩余部分是否也与haystack
中从当前索引i
开始的子串匹配。这通过另一个for
循环实现,循环变量j
从1
开始,直到needle
的长度。 -
在内部的
for
循环中,如果发现任何不匹配的字符,将flag
变量设置为false
并跳出循环。如果所有字符都匹配,flag
保持为true
。 -
如果
flag
为true
,说明找到了匹配的子串,函数返回当前索引i
。 -
如果循环结束后没有找到匹配的子串,函数返回
-1
。
这段代码的效率取决于 haystack
和 needle
的长度。在最坏的情况下,它的时间复杂度是 O(n*m)
,其中 n
是 haystack
的长度,m
是 needle
的长度,因为它可能需要检查 haystack
中的每个可能的子串。然而,如果 needle
的第一个字符在 haystack
中不常见,或者 needle
很短,这段代码可能会更快地返回结果。