KMP演算法——next陣列
阿新 • • 發佈:2022-02-12
字串的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