LeetCode 28. 实现 strStr()

leetcode 028.实现strStr(),即查找重复字符串(KMP算法) 前言 本题是经典的字符串单模匹配的模型,因此可以使用字符串匹配算法解决,常见的字符串匹配算法包括暴力匹配、Knuth-Morris-Pratt 算法、Boyer-Moore 算法、Sunday 算法等,本文 ## 前言 本题是经典的字符串单模匹配的模型,因此可以使用字符串匹配算法解决,常见的字符串匹配算法包括暴力匹配、Knuth-Morris-Pratt 算法、Boyer-Moore 算法、Sunday 算法等,本文将讲解朴素解法(暴力匹配)和KMP算法 因为哈希方法可能出现哈希值相等但是字符串不相等的情况 阅读详情

链接:https://leetcode-cn.com/problems/implement-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 = "", needle = ""
输出:0

虽然这是一道简单题,但是也有着不简单的解法,这里附上暴力匹配的解法和Rabin Karp的解法,至于KMP的解法虽然经典,但是代码并不好记,实际面试还是采用Rabin Karp更加方便,而且两者时间复杂度相同。

1 暴力匹配

原字符串长度为n,需匹配字符串长度为m。时间复杂度 O(m*n)

class Solution:
    def strStr(self, haystack: str, needle: str) -> int:
        if haystack is None or needle is None:
            return -1
        if len(needle) == 0:
            return 0

        tar_len = len(needle)
        for i in range(len(haystack) - tar_len + 1):
            for j in range(tar_len):  # 原地匹配, 避免传参过程中复制字符串的时间消耗
                if haystack[i + j] != needle[j]:
                    break
            else:
                return i
        return -1

2 Rabin Karp

时间复杂度 O(n+m)
Rabin Karp解法的思路十分好记,将原来暴力解法中每个子串的匹配,代替成哈希值的匹配即可,不过哈希值的计算需要仔细设计,通过前一个子串的哈希值,就可以在O(1)的时间下算出下一个子串的哈希值,因此匹配哈希值的部分需要O(n)。最后在哈希值相等的情况下,为了避免哈希冲突,再次进行字符的逐个匹配,时间消耗O(m) ,所以最终时间复杂度为O(n+m)

class Solution_Rabin_Karp:
    """
    Rabin Karp 算法求解字符串匹配 时间O(n+m)
    """
    def strStr(self, haystack: str, needle: str) -> int:
        if haystack is None or needle is None:
            return -1
        if len(needle) == 0:
            return 0

        tar_len = len(needle)
        tar_hash = self.str2hash(needle, begin=0, end=tar_len, order=0)
        src_hash = 0
        for i in range(len(haystack) - tar_len + 1):
            src_hash = self.str2hash(haystack, begin=i, end=i + tar_len, pre_hash=src_hash, order=i)
            if src_hash == tar_hash:
                for j in range(tar_len):
                    if haystack[i + j] != needle[j]:  # 再次比较, 避免哈希冲突的结果
                        break
                else:
                    return i
        return -1

    def str2hash(self, input_str, begin, end, pre_hash=0, order=0):

        hash_value = 0
        weight = 31
        mod = 1e6

        if order == 0:
            for s in input_str[begin:end]:
                hash_value = hash_value * weight + ord(s)
                hash_value = int(hash_value % mod)
            return hash_value

        power = pow(weight, end - begin - 1) % mod
        hash_value = pre_hash - ord(input_str[begin - 1]) * power
        hash_value = (hash_value + mod) % mod  # 防止为负数
        hash_value = hash_value * weight + ord(input_str[end - 1])

        return int(hash_value % mod)

3 原地匹配

由于字符串是不可变类型,在进行函数参数传递时将为形参重新生成一份原字符串,这里将进行一定时间的消耗。而在原地计算哈希值或匹配字符串,则可避免这些消耗,下面是Rabin Karp原地哈希的代码,多次运行计时后,发现是比传参的形式快了一些,但代码的可读性就差了一点。

class Solution_Rabin_Karp_inplace:
    """
    Rabin Karp 算法求解字符串匹配 时间O(n+m)
    """
    weight = 31
    Base = 1e6

    def strStr(self, haystack: str, needle: str) -> int:
        if haystack is None or needle is None:
            return -1
        if len(needle) == 0:
            return 0

        tar_len = len(needle)

        # generate target hash code
        tar_hash = 0
        for s in needle:
            tar_hash = tar_hash * self.weight + ord(s)
            tar_hash = int(tar_hash % self.Base)

        src_hash = 0
        for i in range(len(haystack) - tar_len + 1):
            if i == 0:  # first substring hash code
                for s in haystack[i: i + tar_len]:
                    src_hash = src_hash * self.weight + ord(s)
                    src_hash = int(src_hash % self.Base)
            else:
                power = pow(self.weight, tar_len - 1) % self.Base
                src_hash = src_hash - ord(haystack[i - 1]) * power
                src_hash = (src_hash + self.Base) % self.Base  # 防止为负数
                src_hash = int(src_hash * self.weight + ord(haystack[i + tar_len - 1])) % self.Base

            if src_hash == tar_hash:
                for j in range(tar_len):
                    if haystack[i + j] != needle[j]:  # 再次比较, 避免哈希冲突的结果
                        break
                else:
                    return i
        return -1
LeetCode28 KMP算法实例 LeetCode28题 KMP算法初见 阅读详情

相关推荐

LeetCode28—KMP算法

实现strStr() 1. 题目描述 实现 strStr() 函数。 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。 说明: 当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。 对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与 C 语言的 strstr() 以及 Java 的 indexOf() 定义相符。 示例 输入:

xws__meizhong的博客 344

28. 实现 strStr()

https://leetcode-cn.com/problems/implement-strstr/ 难度简单1002 实现strStr()函数。 给你两个字符串haystack和needle,请你在haystack字符串中找出needle字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回-1。 说明: 当needle是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。 对于本题而言,当needle是空字符串时我们应当返回 0 。这与...

肥不溜秋大梅子 546

LeetCode——28,实现 strStr() 函数

/** * \* Created: liuhuichao * \* Date: 2019/4/23 * \* Time: 11:25 AM * \* Description: 实现 strStr() 函数 * <p> * 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如...

我们的征途是星辰大海 730

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

我的前端面试题练习》》》#每日一题 问题描述: 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/implement-strstr 实现strStr() 函数。 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。 说明: 当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。 对于本题而言,当 n

老衲的少女心i~ 5175

Allegro老鸟的20年效率秘籍:用YepEda Skill脚本实现PCB设计全流程自动化

本文分享了Allegro资深工程师20年效率秘籍,通过YepEda Skill脚本实现PCB设计全流程自动化。从封装建库到规则配置,再到DFM审核,YepEda Skill大幅提升设计效率,每天节省至少4小时重复劳动。文章详细解析了自动化工具链的核心功能,并提供了实战技巧和量化对比数据。

weixin_42546392的博客 236

OpenClaw 快速安装与本地应用实战 —— 每一步都有截图加详细说明,本地AI助手,让打工人也有下属

《OpenClaw 2026开源智能体框架10分钟快速部署指南》摘要:本文提供OpenClaw最新版全平台部署方案,重点解决三大核心问题:1)环境配置优化,通过一键脚本实现3-8分钟快速安装(含国内镜像加速方案);2)初始化配置详解,包含大模型绑定(智普AI/本地模型)与5个高频技能安装;3)实战演示文件自动整理任务。同时总结6类常见故障解决方案,涵盖权限、端口占用等典型问题,确保用户从安装到首个自动化任务落地全程无障碍。特别强调Windows需管理员权限、禁用中文路径等关键注意事项,实现"安装即

weixin_43538316的博客 806

LeetCode力扣真题解惑第1篇 —— 力扣第28题:实现 strStr()函数

LeetCode力扣真题解惑第1篇 —— 实现 strStr() 28. 实现 strStr() 函数。 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。 示例 1: 输入: haystack = “hello”, needle = “ll” 输出: 2 示例 2: 输入: haystack = “aaaaa”, needle = “bba” 输出: -1 说明: 当 need

浮生若梦,云游四方 492

BCM-BCP-DRP-运维管理之故障管理——故障的分类与处理流程

ITSM Business Continuity Manage(BCM) BusinessContinuityPlan(BCP) 偏业务 DisasterRecoveryPlan(DRP) 偏IT 天塌了,考虑在天塌了的状态下做什么,怎么开展业务就是BCP; 天塌了,考虑怎么把天撑回去,就是DRP。 DRP+BCP+供应链管理+危机管理等就是BCM (业务连续性管...

mmgithub123的博客 2720

strstr函数c语言库函数_LeetCode力扣真题解惑第1篇 —— 力扣第28题:实现 strStr()函数...

LeetCode力扣真题解惑第1篇 —— 力扣第28题:实现 strStr()函数28. 实现 strStr() 函数。给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。示例 1:输入: haystack = “hello”, needle = “ll”输出: 2示例 2...

weixin_35823441的博客 207

比例导引算法详解:从理论到Matlab实现(含3D轨迹可视化)

本文深入解析比例导引算法(PNG)的数学原理与Matlab实现,涵盖3D轨迹可视化技术。从基础运动学模型到导航比优化,详细讲解导弹拦截系统的核心算法,并提供Matlab代码示例,帮助读者掌握从理论到实战的全流程。

weixin_33725722的博客 548

史上最全工商银行核心系统建设历程:从“数据集中”到“ECOS”2.0,见证银行业信息科技跨时代发展征程

ECOS工程的直接成果是建成了工商银行第五代信息系统,即从单一核心银行系统到去核心化开放生态系统,率先开启了以智能化、开放化为特征,数据驱动引领经营模式变革,创新提出了一整套国际领先的分布式开放生态银行系统建设方案,在大型银行全分布式系统架构、主机下移、银行系统生态化转型、大规模交易型分布式数据库等多个领域再次实现“0到1”的突破,建成了具备国际领先水平的全分布式开放生态银行系统,继续勇立数字化转型潮头,推动高质量发展再上新台阶。工商银行的业务连续性管理水平实现了跨越式发展,有力地保障了业务发展。

银行信息系统应用架构详解 823

【leetcode力扣】PHP实现:28. 实现 strStr()

题目: 实现strStr()函数。 给定一个haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回-1。 示例 1: 输入: haystack = "hello", needle = "ll" 输出: 2 示例 2: 输入: haystack = "aaaaa", n...

allen的博客 608

凝聚态物理新引擎:AI 驱动材料预测与相变识别大突破

摘要:本文深入探讨 AI 在凝聚态物理中的创新应用。在材料性质预测方面,AI 借助数据收集、特征提取和模型训练,能依据材料微观信息准确预估其宏观性质,以石墨烯为例验证了高效性。对于拓扑相变识别,AI 通过分析量子力学数据,利用机器学习算法判别相变节点,助力拓扑绝缘体研究。尽管面临数据质量、模型可解释性等挑战,但未来多模态数据融合、可解释 AI 等发展方向,将推动 AI 与凝聚态物理深度融合,助力探索物质奥秘与新材料研发。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1824

LeetCode力扣 28. 实现 strStr() Implement strStr() 题解代码 JavaScript

问题https://leetcode-cn.com/problems/implement-strstr/ 练习使用JavaScript解答 /** * @param {string} haystack * @param {string} needle * @return {number} */ var strStr = function(haystack, needle) { return haystack.indexOf(needle); }; 题目是让实现,直接用库好像不太合适.

Coding home - 漂流瓶jz 512

零基础学写《扫雷》游戏(Qt扫雷源码)

扫雷游戏是在windows系统中自带的游戏,他的游戏玩法其实很简单,20世纪初期电脑上没有啥游戏可以玩,所以扫雷游戏也算是当时是最常火爆的一个电脑游戏。以下文章详细介绍扫雷游戏的实现。实现语言为C++。

啊渊的专栏 1万+

[SoC]SoC验证中bootcode与firmware相关验证经验总结

本文总结了SoC验证中bootcode和firmware的验证经验。重点介绍了两种数据加载方法:1)使用Verilog系统函数$readmemh/$readmemb直接写入ROM/ARAM,需注意文件路径、格式和斜杠方向;2)通过Memory Hierarchy在initial块中操作,需要添加适当延时并注意路径拼接。文章还提供了在testcase phase中先读取数据到HASH再写入SRAM的示例,并强调加载后需使能edc_bypass以避免ECC错误。验证过程中需特别注意文件位置、格式要求及路径处理等

元直的博客 2496

Leetcode 28. 实现strStr() Python

Leetcode 28. 实现strStr Python题目自己解法偷鸡解法 题目 实现 strStr() 函数。 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。 示例 1: 输入: haystack = “hello”, needle = “ll” 输出: 2 示...

yo跟着新宇走 349

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

力扣28实现strStr()

力扣28实现strStr() 概述 这道题是要在 haystack 字符串中找到 needle 字符串。下面会给出的三种解法,这三种解法都基于滑动窗口。 子串逐一比较的解法最简单,将长度为 L 的滑动窗口沿着 haystack 字符串逐步移动,并将窗口内的子串与 needle 字符串相比较,时间复杂度为 O((N - L)L)O((N−L)L) 显示上面这个方法是可以优化的。双指针方法虽然也是线性时间复杂度,不过它可以避免比较所有的子串,因此最优情况下的时间复杂度为 O(N)O(N),但最坏情况下的时间复杂

qq_40310710的博客 129

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

LeetCode-28 实现strStr()

LeetCode-28 实现strStr() title: ‘LeetCode-28 实现strStr()’ date: 2018/6/29 16:39:20 tag: [LeetCode,双指针,字符串] categories: 面试题 实现 strStr() 函数。 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 need...

Jae_Peng的博客 403

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Leetcode 28. Implement strStr() 实现strStr()

Leetcode 28. Implement strStr() 实现strStr() 标签: Leetcode 题目地址:https://leetcode-cn.com/problems/implement-strstr/ 题目描述 实现&nbsp;strStr()&nbsp;函数。 给定一个&nbsp;haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 n...

CoderWangSon 163

LeetCode 28 实现 strStr()

LeetCode 28 实现 strStr() 题目 实现 strStr() 函数。 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。 示例 1: 输入: haystack = “hello”, needle = “ll” 输出: 2 示例 2: 输入: haysta...

Ailecccc的博客 119

LeetCode 28 实现strStr()

LeetCode 28 strStr() 1. 题解: 实现 strStr() 函数 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。 说明: 当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。 对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与 C 语言的 strstr() 以及 Java 的 indexOf() 定义相符。

qq_51451731的博客 202

LeetCode-[28] 实现strStr()

@lc app=leetcode.cn id=28 lang=java [28] 实现strStr() https://leetcode-cn.com/problems/implement-strstr/description/ algorithms Easy (38.00%) Total Accepted: 48K Total Submissions: 126.2K Testcas...

fffzlfk的博客 169

leetCode_28. 实现 strStr()

leetcode_28. 实现 strStr() 一、题目描述 实现 strStr() 函数。 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。 说明: 当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。 对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与 C 语言的 strstr() 以及 Java 的 indexOf()

qq_47346664的博客 354
上一篇: LeetCode 5. 最长回文子串
下一篇: 深度可分离卷积 (Depth-wise Separabel Convolution)
von Libniz
博客等级 码龄8年 421粉丝 173原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值