leetcode1147. 段式回文

掌握了Rabin-Karp 算法这题应该挺简单
贪心思路比较直接,但不会证明
注意两点:

  1. 何时结果加1 何时结果不用加1
  2. 逆序计算哈希如何根据题意和正序对应
def longestDecomposition(self, text):
        """
        :type text: str
        :rtype: int
        """
        mul = 1
        base = 25           #字符串哈希,一共26个字母>=26即可
        mod = 10**7+1117    #大质数作为模减少碰撞和计算量
        res = 0
        l,r = 0,len(text)-1
        number1,number2 = 0, 0
        arr = [ord(c) - ord("a") for c in text]
        while l < r:
            number1 = (number1*base + arr[l])%mod   #从前往后计算哈希
            number2 = (number2 + arr[r]*mul)%mod    #从后往前计算哈希
            mul *= base%mod                         #这里本来是arr[r]**(base)^i次方,i是迭代次数,乘法比大的幂次计算节约时间
            l += 1
            r -= 1
            if number1 == number2:                  #找到一组答案加二并重置
                res += 2                            #必须重置,因为我们的计算规则
                number1 = 0                         #如"(a)(nt)(a)(pre)(za)(tpe)(za)(pre)(a)(nt)(a)"。
                number2 = 0                         #ant 和后面的 nta哈希值就不一样  nt和nt是一样的
                mul = 1
        if l == r:                                 #相等时剩最后一个中间字符,根据规则加1
            res += 1
        if number1 != number2 and l > r:           #l>r时如果number1=number2说明最后字符串刚好完全两两匹配
            res += 1                               #如果不相等说明剩了一段没有匹配,要加1
        return res

你可能感兴趣的:(Rabin-Karp,字符串哈希算法,算法)