1044. 最长重复子串 二分 + Rabin-Karp | | 后缀数组


题目链接

Rabin-Karp算法思路:推荐Rabin-Karp算法的讲解,,力扣官方

自己的理解:Rabin-Karp形如下面的例子,这个算法能够快速的比较是否存在某个字符串,并且方便删除头一个元素,然后在尾部加入一个元素。
为什么?看下面的例子。

1123456789 字符集[1,2,3,4,5,6,7,8,9,0] 长度为10

目标串:123 = 1 * 10 ^ 2 + 2 * 10 ^ 1 + 3 * 10 ^ 0

112 : 112

123 : 123 = (112 - 1 * 10 ^ 2) + 3 * 10 ^ 0 = (112 - 100)* 10 + 3

234 : 234 = (123 - 1 * 10 ^ 2) + 4 * 10 ^ 0 = (123 - 100)* 10 + 4

345 : 345 = (234 - 2 * 10 ^ 2) + 5 * 10 ^ 0 = (234 - 200)* 10 + 5

Rabin-Karp写法,代码来自,wa_tle评论给的代码

class Solution {
    public String longestDupSubstring(String str) {
        int[] arr = new int[str.length()];
        for(int i=0; i 0) {
                left = mid;
            } else {
                right = mid-1;
            }
        }
        int start = checkRK(arr, left);
        if(start == -1) return "";
        else return str.substring(start, start + left);
    }

    final long modulus = (long)Math.pow(2,32); // 取模的模值
    final int a = 26; // 系数

    private int checkRK(int[] arr, int length) {
        long curHash = 0;
        HashSet seen = new HashSet<>();
        // 首先统计0----length-1 这个长为length的的哈希值
        for (int i=0; i

后缀数组写法

待填写