实现 strStr()
Opened this issue · 0 comments
Bulandent commented
实现 strStr()
难度:简单
来源:LeetCode 28
实现 strStr()
函数。
给定一个 haystack
字符串和一个 needle
字符串,在 haystack
字符串中找出 needle
字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。
示例 1:
输入: haystack = "hello", needle = "ll"
输出: 2
示例 2:
输入: haystack = "aaaaa", needle = "bba"
输出: -1
说明:
当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。
对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与C语言的 strstr() 以及 Java的 indexOf() 定义相符
题解一:子串逐一比较
/**
* @param {string} haystack
* @param {string} needle
* @return {number}
*/
var strStr = function(haystack, needle) {
if (needle === '') return 0
for(let i = 0, l = haystack.length; i < l; i++) {
if (haystack[i] === needle[0]) {
if (needle === haystack.substring(i, i + needle.length)) {
return i
}
}
}
return -1
};
- 时间复杂度:O((n-l)l),其中 n 为 haystack 长度,l 为 needle 长度,执行用时:80 ms
- 空间复杂度:O(1),内存消耗:40.6 MB
题解二:双指针
var strStr = function(haystack, needle) {
const n = haystack.length, l = needle.length
if (l === 0) {
return 0
}
let pn = 0
while (pn < n - l + 1) {
while (pn < n - l + 1 && haystack.charAt(pn) !== needle.charAt(0)){
++pn
}
let curr = 0, pl = 0
while (pl < l && pn < n && haystack.charAt(pn) === needle.charAt(pl)) {
++pn
++pl
++curr
}
if (curr === l) {
return pn - l
}
pn = pn - curr + 1
}
return -1
}
- 时间复杂度:最坏 O((n - l)l,最优 O(n);执行用时:80 ms
- 空间复杂度:O(1);内存消耗:38.8 MB