力扣--28. 实现 strStr() (简单题)

本文介绍力扣第28题strStr函数的实现方法,包括暴力搜索及KMP算法的应用。针对不同情况给出具体代码实现,并讨论了空字符串等特殊情况的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


(简单题) )
今天的第二道简单题,先用了暴力搜索法,耗时比较长。

【题目描述】

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

【暴力搜索】

【思路】

首先,特殊情况处理:needle为空字符串时,返回0,当needle的长度大于haystack时,返回-1;对于一般情况:直接遍历haystack,当haystack[i]==needle[0],表明可能出现,先暂存当前的i.然后对比后面的每一位是否相符,相符则返回答案,不相符则将i置为之前记录的值+1继续找。
如果遍历完还没找到,就返回-1.

【代码】

class Solution {
public:
    int strStr(string haystack, string needle) {
        if(needle==""){
            return 0;
        }
        else if(needle.length()>haystack.length()){
            return -1;
        }
        else{
            int i=0;
            while(i<haystack.length()){
                if(haystack[i]==needle[0]){
                    int t=i,flag=1;
                    i++;
                    for(int j=1;j<needle.length();j++){
                        if(needle[j]!=haystack[i]){
                            flag=0;
                            break;
                        }
                        i++;
                    }
                    if(flag==1){
                        return t;
                    }
                    else{
                        i=t+1;
                    }
                }
                else{
                    i++;
                }
            }
            return -1;
        }
    }
};

执行结果:
在这里插入图片描述
暴力搜索耗时太长,再想想有没有更好的方法。
看了看解答区,发现这个问题叫做字符串匹配问题,常见的算法有:BF、BM、KMP三种,巧了,我居然一种都没听过。
对于前两种,好像应用没有那么广泛,所以先说说KMP算法吧。
看到两篇写的比较详细的解答:
KMP解法讲解1
KMP解法讲解2
以及B站的一个讲解视频:
KMP算法讲解视频
今天困了,下次再看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一颗小芋圆

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

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

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

打赏作者

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

抵扣说明:

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

余额充值