1. 程式人生 > 其它 >KMP演算法——next陣列

KMP演算法——next陣列

字串的next陣列,也即字首表。

字串字首:不包含最後一個字元的所有以第一個字元開頭的連續子串,字尾同理。

如字串 "abcabf" :

"a" 的前後綴長度為0,即 next[0] = 0,

"ab"的前後綴長度為0,即 next[1] = 0,

"abc"的前後綴長度為0,即 next[2] = 0,

"abca"的前後綴長度為1,即 next[3] = 1,

"abcab"的前後綴長度為2,即 next[4] = 2,

"abcabf"的前後綴長度為0,即 next[5] = 0。

程式碼如下:

 1     String s = "abcabf";
 2     int next[] = new int
[s.length()]; 3 for( int left = 0, right = 1;right<s.length();right++) { 4 while (left > 0 && s.charAt(left) != s.charAt(right)) { 5 left = next[left - 1]; //重置left 6 } 7 if (s.charAt(left) == s.charAt(right)) 8 left++; 9 next[right] = left;
10 }

如果s.charAt(left) 等於s.charAt(right),儲存當前位置的next值,兩指標都右移一位;

如果s.charAt(left) 不等於s.charAt(right),重置 left 指標,不能直接將其賦值為0,要取 left 指標前子串的前後綴長度。

如下所示:

此時 f != e,若 left = 0,a 還是不等於 e,但 abe == abe;

將 left = next[ left - 1 ],left = next[4],為2,直接從e開始與最後一個字元比較。

2022-2-12 12:00