串′ababaaababaa′的next陣列(求next陣列思路與例項)
剛剛開始遇到這個問題說實話完全懵逼,然後簡單搜了下,還是理解的模稜兩可。最後看了幾篇部落格,現在才算是真正的理解了。
首先在將例子之前先說說這個next陣列求解的思路:
第一位的next的值是0,第二位的next的值為1,後面求解每一位的next的值時。首先將前一位與其next值對應的內容進行比較,如果相等,則該位的next值就是前一位的next值加上1;如果不等,如果不等,向前繼續尋找next值對應的內容與前一位進行比較(向前繼續尋找next值對應的內容與next值對應的內容的next前一位進行比較),直到找到某個位上的內容的next值對應的內容與前一位相等為止,則這個位對應的值加上1即為需求的next值;如果找到第一位都沒有找到與前一位相等的內容,那麼需求的位上的next值即為1。所以中心思想則是遞進檢視前一位的next對應的是否和前一位相同。找到相同的則在找到的基礎上加1。
求串′ababaaababaa′的next陣列
模式串 | a | b | a | b | a | a | a | b | a | b | a | a |
---|---|---|---|---|---|---|---|---|---|---|---|---|
下標 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
1、前兩位:next陣列前兩位規定是0,1 即前兩位ab對應的next陣列為01,則:
模式串 | a | b | a | b | a | a | a | b | a | b | a | a |
---|---|---|---|---|---|---|---|---|---|---|---|---|
下標 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
next陣列 | 0 | 1 |
2、接下來看第三位,按照next陣列求解方法。第三位a的前一位為第二位的b,b的next值為1對應內容為a,b與a不同,向前繼續尋找next值對應的內容來與前一位進行比較。因為找到第一位都沒有找到與前一位相等的內容,所以第三位a的next值為1,則:
模式串 | a | b | a | b | a | a | a | b | a | b | a | a |
---|---|---|---|---|---|---|---|---|---|---|---|---|
下標 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
next陣列 | 0 | 1 | 1 |
3、接下來看第四位b,b的前一位a的next值1對應內容為a,相同,所以該位b的next值就是前一位a的next值加上1,即為2
模式串 | a | b | a | b | a | a | a | b | a | b | a | a |
---|---|---|---|---|---|---|---|---|---|---|---|---|
下標 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
next陣列 | 0 | 1 | 1 | 2 |
4、接下來看第五位a,a的前一位b的next值2對應內容為b,相等,所以該位a的next值就是前一位b的next值加上1,即為3
模式串 | a | b | a | b | a | a | a | b | a | b | a | a |
---|---|---|---|---|---|---|---|---|---|---|---|---|
下標 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
next陣列 | 0 | 1 | 1 | 2 | 3 |
5、接下來看第六位a,a的前一位a的next值3對應內容為a,相等,所以該位a的next值就是前一位a的next值加上1,即為4
模式串 | a | b | a | b | a | a | a | b | a | b | a | a |
---|---|---|---|---|---|---|---|---|---|---|---|---|
下標 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
next陣列 | 0 | 1 | 1 | 2 | 3 | 4 |
6、接下來看第七位a,a的前一位a的next值4對應內容為b,不相等,向前繼續尋找next值對應的內容來與前一位進行比較,b的next值2對應的內容為b,依舊不相等,繼續向前尋找,第二位b的next值1對應內容為a,相等。因為是在第二位b處實現的相等,所以第七位a的next值為第二位b的next值上加1,即為2
模式串 | a | b | a | b | a | a | a | b | a | b | a | a |
---|---|---|---|---|---|---|---|---|---|---|---|---|
下標 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
next陣列 | 0 | 1 | 1 | 2 | 3 | 4 | 2 |
7、接下來看第八位,同樣道理,得出b的next值為2
模式串 | a | b | a | b | a | a | a | b | a | b | a | a |
---|---|---|---|---|---|---|---|---|---|---|---|---|
下標 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
next陣列 | 0 | 1 | 1 | 2 | 3 | 4 | 2 | 2 |
8、接下來看第九位,前一位b的next值2對應內容為b,相等,所以此處next值為3
模式串 | a | b | a | b | a | a | a | b | a | b | a | a |
---|---|---|---|---|---|---|---|---|---|---|---|---|
下標 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
next陣列 | 0 | 1 | 1 | 2 | 3 | 4 | 2 | 2 | 3 |
9、第十位同理可得,為4
模式串 | a | b | a | b | a | a | a | b | a | b | a | a |
---|---|---|---|---|---|---|---|---|---|---|---|---|
下標 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
next陣列 | 0 | 1 | 1 | 2 | 3 | 4 | 2 | 2 | 3 | 4 |
10、第十一位a的前一位b的next值4對應內容為b,相等,所以此處next值為5
模式串 | a | b | a | b | a | a | a | b | a | b | a | a |
---|---|---|---|---|---|---|---|---|---|---|---|---|
下標 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
next陣列 | 0 | 1 | 1 | 2 | 3 | 4 | 2 | 2 | 3 | 4 | 5 |
11、最後,第十二位同理可以得到next值位6
模式串 | a | b | a | b | a | a | a | b | a | b | a | a |
---|---|---|---|---|---|---|---|---|---|---|---|---|
下標 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
next陣列 | 0 | 1 | 1 | 2 | 3 | 4 | 2 | 2 | 3 | 4 | 5 | 6 |