LeetCode | 28.找出字符串中第一个匹配项的下标 KMP

这是字符串匹配问题,朴素做法是两重遍历,依次从主串的i位置开始查看是否和模式串匹配,若不匹配就换下一个位置进行判断,直到找到或者遍历完,时间复杂度 O ( m × n ) O(m \times n) O(m×n)

还可以对主串进行处理,把所有匹配模式串的字串替换为"1",然后在替换后的主串里面寻找第一个"1"出现的位置

但是这道题时间复杂度最低的还是得考虑用KMP算法,时间复杂度 O ( m + n ) O(m + n) O(m+n),这里我是看到Youtube上一位博主的讲解才恍然大悟的,链接在这里

python 复制代码
class Solution(object):
    def strStr(self, haystack, needle):
        """
        :type haystack: str
        :type needle: str
        :rtype: int
        """
        if len(needle) == 0:
            return 0
        if len(needle) > len(haystack):
            return -1
        
        next = self.getNext(needle)
        j = 0
        for i in range(len(haystack)):
            while j > 0 and haystack[i] != needle[j]:
                j = next[j-1]
            if haystack[i] == needle[j]:
                j += 1
            if j == len(needle):
                return i - j + 1
        return -1

    def getNext(self, needle):
        next = [0] * len(needle)
        j = 0
        for i in range(1, len(needle)):
            while j > 0 and needle[j] != needle[i]:
                j = next[j-1]
            if needle[j] == needle[i]:
                j += 1
            next[i] = j
        return next

class Solution(object):
    def strStr(self, haystack, needle):
        """
        :type haystack: str
        :type needle: str
        :rtype: int
        """
        restr = haystack.replace(needle, '1')
        for i in range(len(restr)):
            if restr[i] == '1':
                return i
        return -1
相关推荐
AAD55588899几秒前
光伏组件检测与识别基于RPN_X101-FPN模型实现含Python源码_1
开发语言·python
啊阿狸不会拉杆几秒前
《机器学习》第五章-集成学习(Bagging/Boosting)
人工智能·算法·机器学习·计算机视觉·集成学习·boosting
信奥卷王1 分钟前
2025年3月GESPC++四级真题解析(含视频)
算法
后来后来啊2 分钟前
2026.1.21学习笔记
笔记·学习·leetcode·#算法·#cpp
圣保罗的大教堂2 分钟前
leetcode 3314. 构造最小位运算数组 I 简单
leetcode
飞Link4 分钟前
偏好对齐阶段中的通用模型蒸馏、领域模型蒸馏和模型自我提升
python·数据挖掘
whhzhai4 分钟前
装饰器(跨领域调用时增强异常信息)
python
幻云20107 分钟前
Python深度学习:从筑基与巅峰
前端·javascript·vue.js·人工智能·python
_OP_CHEN7 分钟前
【算法基础篇】(四十九)数论之中国剩余定理终极指南:从孙子算经到算法竞赛
算法·蓝桥杯·数论·中国剩余定理·算法竞赛·乘法逆元·acm/icpc
2401_827499998 分钟前
代码随想录-图论28
算法·深度优先·图论