力扣(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) 时间复杂度,对于此问题的约束是可以接受的。

相关推荐
xing-xing1 分钟前
Anaconda学习总结
python
独自破碎E1 分钟前
机器人Java后端算法笔试题解析
java·windows·算法
爱吃苹果的梨叔4 分钟前
2026分布式坐席系统推荐:指挥中心、调度中心、机房集中管控该怎么选?
python
运筹vivo@4 分钟前
3043. 最长公共前缀的长度(Leetcode 每日一题)
c++·算法·leetcode·职场和发展·每日一题
liuhl09105 分钟前
Python 列表推导式
python
测试19987 小时前
软件测试 - 单元测试总结
自动化测试·软件测试·python·测试工具·职场和发展·单元测试·测试用例
Mahir089 小时前
Spring 循环依赖深度解密:从问题本质到三级缓存源码级解析
java·后端·spring·缓存·面试·循环依赖·三级缓存
曲幽9 小时前
我用了FastApiAdmin后,连夜把踩过的坑都整理出来了
redis·python·postgresql·vue3·fastapi·web·sqlalchemy·admin·fastapiadmin
心中有国也有家10 小时前
cann-recipes-infer:昇腾 NPU 推理的“菜谱集合”
经验分享·笔记·学习·算法
前端若水11 小时前
会话管理:创建、切换、删除对话历史
前端·人工智能·python·react.js