美文网首页
最长重复子串

最长重复子串

作者: xialu | 来源:发表于2021-12-23 21:54 被阅读0次

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/longest-duplicate-substring

    题目描述:

    给你一个字符串 s ,考虑其所有 重复子串 :即,s 的连续子串,在 s 中出现 2 次或更多次。这些出现之间可能存在重叠。
    返回 任意一个 可能具有最长长度的重复子串。如果 s 不含重复子串,那么答案为 "" 。

    示例 1:

    输入:s = "banana"
    输出:"ana"

    示例 2:

    输入:s = "abcd"
    输出:""

    代码实现:
    class Solution {
        long[] h, p;
        public String longestDupSubstring(String s) {
            int P = 1313131;
            int n = s.length();
            h = new long[n + 10];
            p = new long[n + 10];
            p[0] = 1;
            for (int i = 0; i < n; i++) {
                p[i + 1] = p[i] * P;
                h[i + 1] = h[i] * P + s.charAt(i);
            }
            String ans = "";
            int l = 0, r = n;
            while (l < r) {
                int mid = l + r + 1 >> 1;
                String t = check(s, mid);
                if (t.length() != 0) l = mid;
                else r = mid - 1;
                ans = t.length() > ans.length() ? t : ans;
            }
            return ans;
        }
    
        public String check(String s, int len) {
            int n = s.length();
            Set<Long> set = new HashSet();
            for (int i = 1; i + len - 1 <= n; i++) {
                int j = i + len - 1;
                long cur = h[j] - h[i - 1] * p[j - i + 1];
                if (set.contains(cur)) return s.substring(i - 1, j);
                set.add(cur);
            }
            return "";
        }
    }
    

    相关文章

      网友评论

          本文标题:最长重复子串

          本文链接:https://www.haomeiwen.com/subject/krykqrtx.html