28. 实现strStr()

难度:简单

目录

一、问题描述

二、解题思路

1、思路

三、解题

1、代码实现

2、时间复杂度 and 空间复杂度


一、问题描述

这里直接采用LeetCode上面的问题描述。

实现 strStr() 函数。

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

说明:

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

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

下面给出示例:

提示:

  • 1 <= haystack.length, needle.length <= 104
  • haystack 和 needle 仅由小写英文字符组成

二、解题思路

1、思路

        这里我题目看错了 0.0,看成了只要匹配第一个字母即可,这个上面的示例也很有迷惑性,实际上是要匹配 needle 中的一整个字符串都有才 返回第一个字母的下标,所以我们要对 needle 的长度进行判断,如果 haystack 的长度没有 needle 的长度长 那么直接返回 false 即可。

        如果出现首字母相等的情况,再应该往后判断 needele 中的整个字符串是否 全部存在于 haystcak 之中,这里还要进行一下判断,如果 haystack 剩下的字符串的 长度 没有 needle 的长度长,那么也可以直接返回 false 了,因为长度不够不可能匹配的。后面只要判断整个字符串是否都相等即可了, 相等的话 可以返回开始判断的那个 下标,否则 再往后移动进行判断直至到最后。

三、解题

1、代码实现

class Solution {
public:
    int strStr(string haystack, string needle) {
        // 长度判断,不满足直接返回 -1
        if(needle.size() > haystack.size()){
            return -1;
        }
        //按题目要求 如果needle是空,那么直接返回 0
        if(needle.empty()){
            return 0;
        }
        //遍历每一个字符
        for(int i = 0; i < haystack.size(); i++){
            //开头相等的话,判断字符串 needle 是否存在于 haystack之中
            if(haystack[i] == needle[0]){
                //haystack剩下的字符长度 没有 needle长的时候 可以直接返回 -1
                if(haystack.size()-i < needle.size()){
                    return -1;
                }
                for(int j = i, m = 0;m < needle.size();j++,m++){
                    //有一个字符 不匹配直接 跳转至下一个字符开始判断
                    if(haystack[j] != needle[m]){
                        goto FLAG;
                    }
                }
                //字符串匹配了之后可以直接 返回 i
                return i;
            }
            FLAG:;
        }
        //全部不匹配 返回 -1
        return -1;    
    }
};

 

2、时间复杂度 and 空间复杂度

时间复杂度:O(n\times m),这里 n 为 haystack 的长度,m 为 needle 的长度。

空间复杂度:O(1),没有占用多余的空间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Alkaid_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值