當串p與串t匹配的時候,返回的首次匹配的位置是i-j
如果遍歷完,不匹配(i=n,j即,p[j]的字首p[0,j)中,所有匹配的真字首和真字尾長度為next(j)
長度為t的字首p[0,t)與長度為t的字尾p[j-t,j)必然相等
如果i、j分別指向的元素不匹配,p[i]≠p[j]
從n(p,j)
中取第t個
元素,令p[t]
對準p[i]
這樣使得前面的p[0,t)個元素就匹配了
解釋:t=n[t](失配,一直遞迴,找next[next[next…]])
n[++j]=++t;(匹配的時候,next[j+1]==next[j]+1)
其中next[j]
在p[0,j)
中最大匹配的真字首和真字尾長度
next[j+1]≤next[j]+1
解釋:下一項的最大匹配項不可能超過上一項+1
當下一項j項匹配,next[j+1]=next[j]+1
;
如果不匹配
,next[j+1]function
buildnext
(p)else
}//返回構造的next()表
returnn;
}
//p模板字串 t是主串
function
match
(p,t)
else
}//遍歷完主串,但是p串還未遍歷完,匹配失敗 返回-1
if(i-j>n-m)
return-1
;return i-j;
}
變體:p[0,j)前的一致,當比較到j和t位置的,此時出現差異,j的內容與p[0,j)內容也一樣,為了不重複比較,重複遞迴
將buildnext()
n[++j]=++t;
變為
++t;
++j;
n[j]=p[j]!=p[t]?t:n[t];
++t;
++j;
//存在匹配的字首 保持字首的next不變
//不匹配改變next
n[j]
=p[j]
!=p[t]
?t:n
[t];
kmp字串匹配
首先要對模式串進行預處理。預處理過程就是計算出指定位置的字首和字尾的最大相同的長度 啊啊啊啊。估計只有我乙個人能看懂 這個文章說得很清楚 比如說 a a a c b c a a a 0 1 2 0 0 0 1 2 3 void getnext int next,char par 20 int n 翻...
字串匹配 KMP
參考 從頭到尾徹底理解kmp 在字串 str 中 匹配模式串 pattern 1.計算模式串的 next 陣列 2.在字串中匹配模式串 當乙個字元匹配時,str i pattern k 繼續匹配下乙個字元 當當前字元不匹配時,根據 next 陣列移動模式字串,k next k next 陣列 描述模...
KMP字串匹配
判斷s中是否含有字串t。一般思路為 從s中首字元開始,依次與t中進行比對,直到t結尾或者某乙個位置兩者不同 如果到t的結尾,則表示s中含有t。如果有乙個位置不相同,那麼從s中下乙個字元開始,再次與t中字元比對。如下 i 0,j 0 for i len 這樣的比較,每一次遇到不同的時候都需要從t串的第...