Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

实现 strStr() #3

Open
Bulandent opened this issue Jan 4, 2021 · 0 comments
Open

实现 strStr() #3

Bulandent opened this issue Jan 4, 2021 · 0 comments

Comments

@Bulandent
Copy link
Owner

Bulandent commented Jan 4, 2021

实现 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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant