leetcode - 3 实现 strstr()

看了好几遍 kmp,算是第一次做 kmp 的题

实现 strStr() 函数。

给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。

示例 1:

输入: haystack = “hello”, needle = “ll”
输出: 2

示例 2:

输入: haystack = “aaaaa”, needle = “bba”
输出: -1

说明:

当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。

对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与C语言的 strstr() 以及 Java的 indexOf() 定义相符。

def strStr(self, haystack: str, needle: str) -> int:
    if not needle:
        return 0
    i = j = 0
    m = len(haystack)
    n = len(needle)
    def getnext(pat):
        n = len(pat)
        next = [-1]*(n+1)
        k = -1
        j = 0
        while(j<n):
            if(k == -1 or pat[k] == pat[j]):
                k+=1
                j+=1
                next[j] = k
            else:
                k = next[k]
        return next
    next = getnext(needle)
    while i<m and j<n:
        if(j==-1 or needle[j]==haystack[i]):
            i+=1
            j+=1
        else:
            j = next[j]
    if j == n:
        return i - j
    else:
        return -1

时间复杂度为 O(n) 空间复杂度为 O(n)

kmp 的思路不是很复杂,就是通过公共的前后缀,在匹配失败后尽可能多的向后移动,因此构建 next 数组然后匹配即可。

这里使用的是没有优化的方法,可以通过对 next[j] 的再次分析避免重复匹配相同字符,即如果字符相同可以跳回 next[next[j]],进行优化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值