1. 程式人生 > >演算法4-7:KMP演算法中的模式串移動陣列(c語言)

演算法4-7:KMP演算法中的模式串移動陣列(c語言)

題目描述

字串的子串定位稱為模式匹配,模式匹配可以有多種方法。簡單的演算法可以使用兩重巢狀迴圈,時間複雜度為母串與子串長度的乘積。而KMP演算法相對來說在時間複雜度上要好得多,為母串與子串長度的和。但其算符比較難以理解。

在KMP演算法中,使用到了一個next陣列。這個陣列就是在比較失配時母串指標不必回溯,而子串指標移動相應位置即可。我們給出書中next陣列的算式表示以及演算法,請你實現之。

圖1:next陣列的算式表示

圖2:next陣列的演算法表示

輸入描述

一個模式串,僅由英文小寫字母組成。長度不大於100。

輸出描述

輸出模式串對應的移動陣列next。每個整數後跟一個空格。

輸入樣例
abaabcac

輸出樣例
0 1 1 2 2 3 1 2

#include<stdio.h>
#include<string.h>

int main()
{
    char a[105];
    char next[105];
    int h, i, j;
    while(~scanf("%s", a))
    {
        h = strlen(a);
        int i = 0;
        next[0] = -1;
        j = -1;
        while(i < a[0])
        {
            if(j == -1 || a[i] == a[j])
            {
                ++i;
                ++j;
                next[i] = j;
            }
            else
                j = next[j];
        }
        for(i = 0; i < h; i++)
        {
            printf("%d ", next[i]+1);
        }
        printf("\n");
    }
}