题目描述
给你两个字符串 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 很短,这段代码可能会更快地返回结果。