1. 程式人生 > >擴展KMP算法

擴展KMP算法

第一個 div class kmp 計算 ble tar 就是 最長

KMP算法中也涉及到子串與前綴的重復,而擴展KMP算法求得就是字符串S的所有後綴與字符串T的最長公共前綴

可以知道,一個字符串所有的子串便是這個字符串所有後綴的所有前綴(或前綴的後綴 ),那麽求的信息其實也是字符串S的所有子串與字符串T前綴的重復

每個後綴的最長公共前綴長度存在一個extend數組中,具體代碼沒有研究,給當模板用了。。

void getextend() {
    int p = 0;
    while (p < m && p < n && s[p + 1] == t[p + 1]) {   //計算第一個後綴
        p++;
    }
    extend[1] = p;
    int k = 1, l;
    for (int i = 2; i <= m; i++) {
        p = k + extend[k] - 1;
        l = next[i - k + 1];
        if (i + l <= p) {
            extend[i] = l;
        } else {
            int j = p - i + 1;
            if(j < 0) j = 0;
            while(i + j <= m && j + 1 <=n && s[i + j] == t[j + 1])    j ++;
            extend[i] = j;
            k = i;
        }
    }
}

  

推薦個題目,旋轉數字 : http://acm.hdu.edu.cn/showproblem.php?pid=4333

擴展KMP算法