前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode题目28:实现strStr()

LeetCode题目28:实现strStr()

作者头像
二环宇少
发布2020-08-13 15:44:09
2980
发布2020-08-13 15:44:09
举报

原题描述

+

实现 strStr() 函数。

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

示例 1:

代码语言:javascript
复制
输入: haystack = "hello", needle = "ll"
输出: 2

示例 2:

代码语言:javascript
复制
输入: 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++参考代码

+

代码语言:javascript
复制
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;
    }
};
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-07-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 互联网西门二少 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档