原理

public int[] zFunction(String s) {
        int n = s.length();
        char[] c = s.toCharArray();
        int[] z = new int[n];
        int l = 0;
        int r = 0;
        for(int i = 1;i < n;i++) {
            if(i > r) {
                // 暴力匹配
                while(i + z[i] < n && c[i + z[i]] == c[z[i]]) z[i]++;
            } else {
                if(z[i - l] < r - i + 1) z[i] = z[i - l];
                else {
                    // 跳过前r - i + 1个后继续匹配
                    while(r + z[i] + 1 < n && c[r + z[i] + 1] == c[r - i + 1 + z[i]]) z[i]++;
                    z[i] += r - i + 1;
                }
            }
            if(i + z[i] > r && z[i] != 0) {
                // 更新l、r
                l = i;
                r = i + z[i] - 1;
            }
        }

        return z;
    }
转载请注明出处