KMP字串匹配 JS

2021-10-04 22:45:11 字數 1397 閱讀 6895

當串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串的第...