4.6找出字符串中第一个匹配的下标(还是不太会KMP)

算法:用了KMP算法节省时间、空间复杂度

不过代码还是不太会,只能解读正确代码

正确代码:

class Solution:
    def getNext(self, next, s):
        j = -1
        next[0] = j
        for i in range(1, len(s)):
            while j >= 0 and s[i] != s[j+1]:
                j = next[j]
            if s[i] == s[j+1]:
                j += 1
            next[i] = j
    
    def strStr(self, haystack: str, needle: str) -> int:
#首先,检查如果匹配串为空,则直接返回 0,因为一个空串是任何字符串的子串。
        if not needle:
            return 0
#然后,创建一个长度为匹配串长度的列表 `next`,并调用 `getNext` 函数来计算 `next` 列表。
        next = [0] * len(needle)
        self.getNext(next, needle)
#初始化变量 `j` 为 -1,并使用一个循环遍历待搜索的字符串 `haystack` 的每个位置。
        j = -1
        for i in range(len(haystack)):
#在循环中,使用一个 `while` 循环来不断更新变量 `j` 的值,直到 `j` 小于 0 或者当前字符 `haystack[i]` 等于匹配串 `needle` 中的字符 `needle[j+1]`。
            while j >= 0 and haystack[i] != needle[j+1]:
#如果 `haystack[i]` 等于 `needle[j+1]`,则将 `j` 的值增加 1,表示找到了一个匹配。
                j = next[j]
            if haystack[i] == needle[j+1]:
                j += 1
#然后,检查如果 `j` 的值等于匹配串的长度减 1,说明已经找到了完全匹配,返回匹配的起始位置 `i - len(needle) + 1`。
            if j == len(needle) - 1:
#如果循环结束后仍未找到完全匹配,则返回 -1,表示未找到匹配。
                return i - len(needle) + 1
        return -1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值