【LeetCode】每日一题:28. 实现 strStr()

68 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第7天,点击查看活动详情

28. 实现 strStr()

实现 strStr() 函数。

给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。

说明:

当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。

对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与 C 语言的 strstr() 以及 Java 的 indexOf() 定义相符。

「示例1:」
输入:haystack = "hello", needle = "ll"
输出:2
「示例2:」
输入:haystack = "aaaaa", needle = "bba"
输出:-1
「示例3:」
输入:haystack = "aaaabbb", needle = "accccccc"
输出:1
「示例4:」
输入:haystack = "abc", needle = "cba"
输出:-1
「示例5:」
输入:haystack = "qqqqww", needle = "aaaaww"
输出:2
「示例6:」
输入:haystack = "tttt", needle = "ttttyyy"
输出:4
「示例7:」
输入:haystack = "azzzz", needle = "bvvvvv"
输出:-1
「示例8:」
输入:haystack = "fffffddddd", needle = "ffaaaaaaa"
输出:2
「提示:」
1. 1 <= haystack.length, needle.length <= 104
2. haystack 和 needle 仅由小写英文字符组成

解题思路

因为哈希方法可能出现哈希值相等但是字符串不相等的情况,而 strStr 函数要求匹配结果必定正确
​
我们可以让字符串 needle 与字符串 haystack 的所有长度为 m 的子串均匹配一次。
​
为了减少不必要的匹配,我们每次匹配失败即立刻停止当前子串的匹配,对下一个子串继续匹配。如果当前子串匹配成功,我们返回当前子串的开始位置即可。如果所有子串都匹配失败,则返回 −1。

代码实现

var strStr = function(haystack, needle) {
    const n = haystack.length, m = needle.length;
    for (let i = 0; i + m <= n; i++) {
        let flag = true;
        for (let j = 0; j < m; j++) {
            if (haystack[i + j] != needle[j]) {
                flag = false;
                break;
            }
        }
        if (flag) {
            return i;
        }
    }
    return -1;
};

如果你对这道题目还有疑问的话,可以在评论区进行留言;