力扣(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 小时前
Vue 基础理论 & API 使用
前端·vue.js·面试
牛奶6 小时前
Vue 底层原理 & 新特性
前端·vue.js·面试
NAGNIP7 小时前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
青青家的小灰灰12 小时前
深入理解事件循环:异步编程的基石
前端·javascript·面试
AI探索者12 小时前
LangGraph StateGraph 实战:状态机聊天机器人构建指南
python
AI探索者12 小时前
LangGraph 入门:构建带记忆功能的天气查询 Agent
python
程序员清风13 小时前
程序员兼职必看:靠谱软件外包平台挑选指南与避坑清单!
java·后端·面试
FishCoderh14 小时前
Python自动化办公实战:批量重命名文件,告别手动操作
python
躺平大鹅14 小时前
Python函数入门详解(定义+调用+参数)
python
曲幽15 小时前
我用FastAPI接ollama大模型,差点被asyncio整崩溃(附对话窗口实战)
python·fastapi·web·async·httpx·asyncio·ollama