LeetCode题目28:实现strStr()

时间:2022-07-23
本文章向大家介绍LeetCode题目28:实现strStr(),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

原题描述

+

实现 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() 定义相符。

原题链接:https://leetcode-cn.com/problems/implement-strstr

思路解析

+

一般来说,解决这道题的方法是KMP算法。记得当时学数据结构的时候,KMP算法一直是我的噩梦,今天我用一种普通的回溯方法解决这道题。

我们假设haystack的长度为 ,needle的长度为 ,我们使用两个指针ph和pn分别指向haystack和needle的头部。

首先,只有当子串的第一个字符跟 needle 字符串第一个字符相同的时候才需要比较。通过递增ph,我们可以找到对应的位置。

然后,进入逐一匹配判断的阶段,一旦不匹配则立刻终止。

当匹配不正确时立即回溯pn指针到needle的开头,以便于和haystack后面的部分继续匹配。同时,ph指针也需要回溯到ph-curr_len+1处。

重复以上过程,当匹配成功时直接返回即可。

复杂度分析

+

  • 时间复杂度:
  • 空间复杂度:

C++参考代码

+

class Solution {
public:
    int strStr(string haystack, string needle) {
        int h = haystack.size(), n = needle.size();
        if (!n) return 0;

        int ph = 0;
        while (ph < h - n + 1) {
            while (ph < h - n + 1 && haystack[ph] != needle[0]) ++ph;

            int curr_len = 0, pn = 0;
            while (ph < h && pn < n && haystack[ph] == needle[pn]) {
                ++curr_len;
                ++ph;
                ++pn;
            }

            if (curr_len == needle.size()) return ph - curr_len;

            ph = ph - curr_len + 1;
        }
        
        return -1;
    }
};