【力扣1392. 最长快乐前缀】前缀后缀数组、Rabin-Karp 字符串编码、kmp(Python3)

题目描述

https://leetcode-cn.com/problems/longest-happy-prefix/
在这里插入图片描述
在这里插入图片描述

思路题解

方法一:前缀后缀数组

不推荐

class Solution:
    def longestPrefix(self, s: str) -> str:
        front,end={},{}
        a,b,n="","",len(s)
        ans=""
        for i in range(n-1):
            a=a+s[i]
            b=s[n-i-1]+b
            if a==b:
                ans=a
        return ans

在这里插入图片描述

方法二:Rabin-Karp 字符串编码

https://leetcode-cn.com/problems/longest-happy-prefix/solution/zui-chang-kuai-le-qian-zhui-by-leetcode-solution/

class Solution:
    def longestPrefix(self, s: str) -> str:#abcab
        n=len(s)
        prefix,suffix=0,0
        base,mod,mul=31,10**9+7,1
        ans=-1 #输入为"a"时,输出为""
        for i in range(n-1):
            tmp=(ord(s[i])-97,ord(s[n-i-1])-97)
            prefix=(prefix*base+tmp[0])%mod #0*31+0 0*31+1 1*31*31+2 ...
            suffix=(tmp[1]*mul+suffix)%mod #1*1+0 0*31+1 2*31*31+1 ...
            # print(prefix,suffix)
            if prefix==suffix:
                ans=i
            mul=mul*base%mod
        return s[:ans+1]
##打印
print(prefix,suffix)0 1
1 1
33 1923
1023 31714

在这里插入图片描述

方法三:kmp

在这里插入图片描述
请添加图片描述

class Solution:
    def longestPrefix(self, s: str) -> str:
        n = len(s)
        fail = [-1] * n
        for i in range(1, n):
            j = fail[i - 1]
            while j != -1 and s[j + 1] != s[i]:
                j = fail[j]
            if s[j + 1] == s[i]:
                fail[i] = j + 1
        return s[:fail[-1] + 1]

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值