KMP筆記 找最大子串,字首自匹配長度

2022-05-05 03:39:10 字數 1180 閱讀 8283

假設s1裡找s2,

然後s2進去匹配

假設在第三位失配

那麼說明前兩位是匹配成功的

如果這時候將s2後移一位相當於將s2的第一位和s2的第二位比較,如果我們已知s1(1)≠s1(2)那麼就可以直接後移兩位

而這時候就是s1(1)和s1(3)比較,如果s1.1=s1.3那就可以直接後移3位了

我們的目標就變成了在s1裡找到乙個遞推式滿足f(i)

i表示在第i位失配後移的位數

現在要找遞推方法,假設f(i)已知現在由f(i)推出f(i+1)

假設f(i)=k,

現在假設失配位是k,我們要做的就是找到乙個最大的m滿足s1[0],s1[1]....s1[m-1]  ==  s1[k-m],s1[k-m+1]...s1[k-1]

回到剛剛的我們假設f [i] = k,那麼f [i+1]

有3種情況:

①s1[k+1] == s1[i+1] —>f[i+1]=k+1

②如果s1[k+1] != s1[i+1] —>問題就變成了在前k個裡找乙個最大的s使得s1[0],s1[1]...s1[s] == s1[k+1-s], s1[k-s] ...s1[k+1]

這個s是已知的,就是f[k+1]

③f[k+1] <=0 —>f[j+1] = 0

that is over.

看到乙個推薦的blog講的超詳細我這麼蒻都看懂了七七八八

mark一下√

//我們要在a串中找b串出現的次數 b串叫做模式串,a串叫做匹配串

考慮暴力匹配的時候在匹配串列舉模式串的開頭在**,一位一位比較是不是相同,不相同的話就把開頭往下移以為繼續判斷

假設模式串匹配了1~j位,在j+1位和匹配串發生了衝突,這時候要在匹配串重新設定開頭從哪一位開始匹配。

/*比如原先是i開頭,就比較i~i+j-1位,然後這i~i+j-1位都是相同的,但是在i+j位它會變成不同的

這時候如果暴力移動指標的話,如果發現從i+1到i+j-1中有一段和i開始到i+j-1位中間有一段是相同的話,那就可以把中間那段替換過去

*///其實就是不匹配的那個的前面x位還是後面x位有匹配串的開頭資磁的xx位就移到x位去

//這樣時間複雜度就低啦

//hzwer說這玩意兒noip不考,省選考,標記一下

突然發現的blog感覺排版什麼的很資磁

KMP 字串匹配(字首陣列)

knuth morris pratt algorithm next陣列 預處理匹配串 匹配串與自己匹配 得到失配陣列 沒了。void getnext char p 匹配串 void kmp char t,char p 文字串,匹配串 abacabababab abab 1.整個演算法的大致和求nex...

最大子串和之字首字尾可反轉

問題描述 給定乙個長度為n的整數序列,可以將該序列的字首和字尾中的每個數字都乘以 1。字首和字尾可以交叉也可以為空。求能得到的最大序列和是多少。輸入描述 輸入為兩行。第一行乙個整數n 1 n 100 表示一共有n個元素 第二行為n個數,即每個整數都在32位int範圍內。以空格分隔。輸出描述 輸出最大...

學習筆記 KMP 字串匹配

目錄完整 最初學這個演算法,是在新初一的暑假裡,乙個初三即將畢業的學長給我們講的。當時聽得不是很懂,模板題也就只有 28pts。後來過了好久,又想起來重新學一遍字串,從 kmp 到 sam 都來一遍。於是便有了這片文章。kmp 演算法是由三名姓氏首字母分別為 k m p 的牛人發明的演算法。雖然我不...