题目描述
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 字符串编码
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]