演算法4-7:KMP演算法中的模式串移動陣列(c語言)
阿新 • • 發佈:2018-11-29
題目描述
字串的子串定位稱為模式匹配,模式匹配可以有多種方法。簡單的演算法可以使用兩重巢狀迴圈,時間複雜度為母串與子串長度的乘積。而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"); } }