二分查找+Robin-Karp算法
python
class Solution:
def longestDupSubstring(self, s: str):
nums = [ord(c)-ord('a')+1 for c in s]
n = len(nums)
def check(L):
P, Q = 131, 2**64
M = P**L%Q
tmp = 0
visited = set()
for i in range(L):
tmp = (tmp*P + nums[i]) % Q
visited.add(tmp)
for i in range(L, n):
tmp = (tmp*P + nums[i] - nums[i-L]*M) % Q
if tmp in visited:
return i-L+1
visited.add(tmp)
return -1
left, right = 0, n-1
res = -1
while left <= right:
mid = int(left+(right-left)/2)
index = check(mid)
if index != -1:
left = mid+1
res = index
else:
right = mid-1
return s[res:res+left-1] if res != -1 else ''