【模板】KMP算法

用途:處理字符串匹配問題

例子:給出兩個字符串s1和s2,其中s2爲s1的子串,求出s2在s1中所有出現的位置
時間複雜度:O(n)

變量解釋:
A[i]:存儲A串
B[i]:存儲B串

p[i]:在B串中與字母B[i]相同的上一個字母的位置 給出兩個字符串s1和s2,其中s2爲s1的子串,求出s2在s1中所有出現的位置

預處理p[]:

void pre()
{
    p[1]=0;
    int j=0;
    for (int i=1;i<m;i++)
    {
        while (j>0&&B[j+1]!=B[i+1]) j=p[j];
        if (B[j+1]==B[i+1]) j++;
        p[i+1]=j;
    }
}

KMP:

int kmp()
{
    int j=0; 
    for (int i=0;i<n;i++)
    {
        while (j>0&&B[j+1]!=A[i+1]) j=p[j];
        if (B[j+1]==A[i+1]) j++;
        if (j==m) 
        {
            printf("%d\n",i+1-m+1);
            j=p[j];
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章