背景
給定一個主串(以 S 代替)和模式串(以 P 代替),要求找出 P 在 S 中出現的位置,此即串的模式匹配問題。
Knuth-Morris-Pratt 算法(簡稱 KMP)是解決這一問題的常用算法之一,這個算法是由高德納(Donald Ervin Knuth)和沃恩·普拉特在 1974 年構思,同年詹姆斯·H·莫裡斯也獨立地設計出該算法,最終三人于 1977 年聯合發表。
基本思想
假設在模式匹配的進程中,執行T[i]和W[j]的匹配檢查。若T[i]=W[j],則繼續檢查T[i+1]和W[j+1]是否匹配。若T[i]<>W[j],則分成兩種情況:若j=1,則模式串右移一位,檢查T[i+1]和W是否匹配;若1<=m,則模式串右移j-next(j)位,檢查T[i]和W[next(j)]是否匹配。重複此過程直到j=m或i=n結束。
文獻中,朱洪對KMP算法作了修改,他修改了KMP算法中的next函數,即求next函數時不但要求W[1,next(j)-1]=W[j-(next(j)-1),j-1],而且要求W[next(j)]<>W[j],他記修改後的next函數為newnext。顯然在模式串字符重複高的情況下,朱洪的KMP算法比KMP算法更加有效。
以下給出朱洪的改進KMP算法和next函數和newnext函數的計算算法。
KMP串匹配算法
輸入:正文串j和模式串W[1,m]
輸出:匹配結果match[1,n]