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

相关推荐
Allen_LVyingbo3 分钟前
量子测量三部曲:投影测量、POVM 与坍缩之谜—从形式主义到物理图像
算法·性能优化·健康医疗·量子计算·空间计算
skilllite作者5 分钟前
SkillLite 多入口架构实战:CLI / Python SDK / MCP / Desktop / Swarm 一页理清
开发语言·人工智能·python·安全·架构·rust·agentskills
qiqsevenqiqiqiqi8 分钟前
位运算 计算
算法
甄心爱学习19 分钟前
【最优化】1-6章习题
人工智能·算法
PD我是你的真爱粉20 分钟前
向量数据库原理与检索算法入门:ANN、HNSW、LSH、PQ 与相似度计算
数据库·人工智能·算法
ZC跨境爬虫20 分钟前
批量爬取小说章节并优化排版(附完整可运行脚本)
前端·爬虫·python·自动化
汀、人工智能22 分钟前
[特殊字符] 第72课:杨辉三角
数据结构·算法·数据库架构·图论·bfs·杨辉三角
ths51222 分钟前
Python 正则表达式实战指南:从入门到精通(12 个高频案例)(三)
python·正则表达式
ZC跨境爬虫22 分钟前
海南大学交友平台登录页开发实战day4(解决python传输并读取登录信息的问题)
开发语言·前端·python·flask·html
Wyawsl24 分钟前
Python操作MySQL数据库
数据库·python·mysql