1044. Longest Duplicate Substring - LeetCode Solution


Hash Binary Search

Python Code:

class Solution:
    def longestDupSubstring(self, S: str) -> str:
        power = 2**63 - 1
        def rabin(mid):
            chash = 0
            for i in range(mid):
                chash = (chash * 26 + nums[i]) % power
            hashes = {chash}
            position = -1
            max_pow = pow(26, mid, power)
            for i in range(mid, len(S)):
                chash = (26*chash-nums[i-mid]*max_pow + nums[i]) % power
                if chash in hashes:
                    position = i + 1 - mid
                hashes.add(chash)
            return position


        low, high = 0, len(S)-1
        end = 0
        start = 0
        nums = [ord(c)-ord('a') for c in S]
        while low <= high:
            mid = (low+high) // 2
            position = rabin(mid)
            if position == -1:  # no matching strings found
                high = mid - 1
            else:
                start = position
                low = mid + 1
        return S[start:start+low-1]


Comments

Submit
0 Comments
More Questions

MAXBRIDGE Maximise the bridges
WLDRPL Wildcard Replacement
1221. Split a String in Balanced Strings
1002. Find Common Characters
1602A - Two Subsequences
1555A - PizzaForces
1607B - Odd Grasshopper
1084A - The Fair Nut and Elevator
1440B - Sum of Medians
1032A - Kitchen Utensils
1501B - Napoleon Cake
1584B - Coloring Rectangles
1562B - Scenes From a Memory
1521A - Nastia and Nearly Good Numbers
208. Implement Trie
1605B - Reverse Sort
1607C - Minimum Extraction
1604B - XOR Specia-LIS-t
1606B - Update Files
1598B - Groups
1602B - Divine Array
1594B - Special Numbers
1614A - Divan and a Store
2085. Count Common Words With One Occurrence
2089. Find Target Indices After Sorting Array
2090. K Radius Subarray Averages
2091. Removing Minimum and Maximum From Array
6. Zigzag Conversion
1612B - Special Permutation
1481. Least Number of Unique Integers after K Removals