题目描述
https://leetcode-cn.com/problems/longest-duplicate-substring/
思路题解
方法一:二分查找+Rabin-Karp 字符串编码
class Solution:
def longestDupSubstring(self, s: str) -> str:
def search(L,a,modulus,n,nums):
h=0
for i in range(L):
h=(h*a+nums[i]) % modulus
seen={h}
aL = pow(a, L, modulus)
for i in range(1,n-L+1):
h=(h*a-nums[i-1]*aL+nums[L+i-1]) % modulus
if h in seen:
return i
seen.add(h)
return -1
a=26
modulus=192608171926081719260817
n=len(s)
nums=[ord(i)-ord("a") for i in s]
left,right=1,n
while left!=right:
L=left + (right - left) // 2
if search(L,a,modulus,n,nums)==-1:
right=L
else:
left=L+1
start=search(left-1,a,modulus,n,nums)
return s[start:start+left-1] if start!=-1 else ""