https://www.cnblogs.com/tangzhengyue/p/4315393.html 非常詳細
1. next數組的含義:
KMP是在一個母字符串中查找一個子字符串的高效算法。它可以在匹配過程中失配的情況下,有效地多往后面跳幾個字符,加快匹配速度。
KMP算法中有個數組,叫做前綴數組,也有的叫next數組,每一個子串有一個固定的next數組,它記錄着字符串匹配過程中失配情況下可以向前多跳幾個字符。當然它描述的也是子串的對稱程度,程度越高,值越大,當然之前可能出現再匹配的機會就更大。
2.next數組的求解方法
第一位的next值為0,第二位的next值為1,后面求解每一位的next值時,根據前一位進行比較。首先將前一位與其next值對應的內容進行比較,如果相等,則該位的next值就是前一位的next值加上1;如果不等,向前繼續尋找next值對應的內容來與前一位進行比較,直到找到某個位上內容的next值對應的內容與前一位相等為止,則這個位對應的值加上1即為需求的next值;如果找到第一位都沒有找到與前一位相等的內容,那么需求的位上的next值即為1。
3.next數組實現
void SetPrefix(char[] P, int prefix[]) { int len=P.length;//模式字符串長度。 prefix[0]=0; for(int i=1; i<len; i++) { int k=prefix[i-1]; //不斷遞歸判斷是否存在子對稱,k=0說明不再有子對稱,Pattern[i] != Pattern[k]說明雖然對稱,但是對稱后面的值和當前的字符值不相等,所以繼續遞推 while( Pattern[i] != Pattern[k] && k!=0 ) k=prefix[k-1]; //繼續遞歸 if( Pattern[i] == Pattern[k])//找到了這個子對稱,或者是直接繼承了前面的對稱性,這兩種都在前面的基礎上++ prefix[i]=k+1; else prefix[i]=0; //如果遍歷了所有子對稱都無效,說明這個新字符不具有對稱性,清0 } }