边工作边刷题:70天一遍leetcode: day 87

Implement strStr()
要点:rolling hash方法的速度比较慢。
小优化:不用hash%base,而用hash-=base*最高位是一样的。
rolling hash错误点:

  • base的连乘少一位,另外别搞成/10
  • python应该是ord(c)-ord(‘a’),不是ord(c)
  • 以i结尾的start index是i-nlen+1,不是i-nlen,实际就是把len和start index在公式中置换一下,所以有+1
  • 开始初始化haystack hash的时候长度是needle len,不要弄混成初始化needle
  • 如果haystack没有needle长,提早返回-1
class Solution(object):
    def strStr(self, haystack, needle):
        """
        :type haystack: str
        :type needle: str
        :rtype: int
        """
        nlen, hlen = len(needle), len(haystack)
        if nlen==0:
            return 0
        if hlen<nlen: # error 1: 
            return -1
        
        gethash = lambda x: ord(x)-ord('a')
        rolling = lambda x,y: x*26+y
        nhash = reduce(rolling, map(gethash, needle))
        hhash = reduce(rolling, map(gethash, haystack[:nlen]))
        
        if nhash==hhash:
            return 0
        
        base = 26**(nlen-1)
        for i in xrange(nlen, hlen):
            hhash-=base*gethash(haystack[i-nlen])
            hhash=hhash*26+gethash(haystack[i])
            if hhash==nhash:
                return i-nlen+1
        return -1
        

转载于:https://www.cnblogs.com/absolute/p/5815798.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值