力扣(LeetCode) 28: 找出字符串中第一个匹配项的下标 - 解法思

问题概述

给定两个字符串 needlehaystack,返回 needlehaystack 中第一次出现的下标,如果 needle 不是 haystack 的一部分则返回 -1

解法 1:暴力匹配带切片(推荐)

工作原理

通过比较子字符串检查 haystack 中每个可能的起始位置:

python 复制代码
class Solution:
    def strStr(self, haystack, needle):
        if not needle:
            return 0
        
        n = len(haystack)
        m = len(needle)
        
        for i in range(n - m + 1):
            if haystack[i:i+m] == needle:
                return i
        
        return -1

复杂度分析

  • 时间复杂度: O(n * m) - 其中 n 是 haystack 的长度,m 是 needle 的长度
  • 空间复杂度: O(1) - 只使用常数额外空间

何时使用

  • 推荐 - 简单直观
  • 易于理解和实现
  • 对于典型的 LeetCode 测试用例很快

解法 2:暴力匹配字符比较

工作原理

相同的方法,但逐个字符比较而不是使用切片:

python 复制代码
class Solution:
    def strStr(self, haystack, needle):
        if not needle:
            return 0
        
        n = len(haystack)
        m = len(needle)
        
        for i in range(n - m + 1):
            j = 0
            while j < m and haystack[i + j] == needle[j]:
                j += 1
            if j == m:
                return i
        
        return -1

复杂度分析

  • 时间复杂度: O(n * m) - 其中 n 是 haystack 的长度,m 是 needle 的长度
  • 空间复杂度: O(1) - 只使用常数额外空间

何时使用

  • 对较长字符串更高效(避免创建子字符串)
  • 可以在发现不匹配时提前终止
  • 适用于 needle 很少出现的情况

对比

方法 时间 空间 最佳适用
暴力匹配切片 O(n*m) O(1) 大多数情况,最简单代码
暴力匹配字符 O(n*m) O(1) 较长字符串,稀有 needle

总结

带切片的暴力匹配方法最简单,在大多数情况下推荐使用。逐字符比较版本对较长字符串可能更高效,因为它避免创建子字符串对象,并可以在不匹配时提前终止。两者都具有 O(n*m) 时间复杂度,对于此问题的约束是可以接受的。

相关推荐
摘星编程6 小时前
深入理解CANN ops-nn BatchNormalization算子:训练加速的关键技术
python
魔芋红茶6 小时前
Python 项目版本控制
开发语言·python
lili-felicity6 小时前
CANN批处理优化技巧:从动态批处理到流水线并行
人工智能·python
一个有梦有戏的人6 小时前
Python3基础:进阶基础,筑牢编程底层能力
后端·python
dazzle6 小时前
机器学习算法原理与实践-入门(三):使用数学方法实现KNN
人工智能·算法·机器学习
那个村的李富贵6 小时前
智能炼金术:CANN加速的新材料AI设计系统
人工智能·算法·aigc·cann
摘星编程6 小时前
解析CANN ops-nn中的Transpose算子:张量维度变换的高效实现
python
Liekkas Kono6 小时前
RapidOCR Python 贡献指南
开发语言·python·rapidocr
张张努力变强6 小时前
C++ STL string 类:常用接口 + auto + 范围 for全攻略,字符串操作效率拉满
开发语言·数据结构·c++·算法·stl
万岳科技系统开发6 小时前
食堂采购系统源码库存扣减算法与并发控制实现详解
java·前端·数据库·算法