10 13總結 kmp演算法

2021-08-29 01:30:43 字數 1136 閱讀 2126

自周四之後這兩天,沒怎麼系統的看,今天週六把作業,等等瑣事處理完了,明天一天沒有別的事,會系統的看看知識點。

今天把kmp演算法看了一看,現在終於明白了:

先理解一下字首和字尾:

則圖中最長公共字首字尾長度為0;

下面再以」abcdabd」為例,進行介紹:

- 」a」的字首和字尾都為空集,共有元素的長度為0;

- 」ab」的字首為[a],字尾為[b],共有元素的長度為0;

- 」abc」的字首為[a, ab],字尾為[bc, c],共有元素的長度0;

- 」abcd」的字首為[a, ab, abc],字尾為[bcd, cd, d],共有元素的長度為0;

- 」abcda」的字首為[a, ab, abc, abcd],字尾為[bcda, cda, da, a],共有元素為」a」,長度為1;

- 」abcdab」的字首為[a, ab, abc, abcd, abcda],字尾為[bcdab, cdab, dab, ab, b],共有元素為」ab」,長度為2;

- 」abcdabd」的字首為[a, ab, abc, abcd, abcda, abcdab],字尾為[bcdabd, cdabd, dabd, abd, bd, d],共有元素的長度為0。

#include#includeusing namespace std;

char a[1007],b[1007];

int p[1007],n,m;

void pre()// 預處理相當於b串,從1到b的長度,找字首等於字尾的最長長度。

} /*int kmp()

}return ans;

}*/void kmp()

{int j=0;

for(int i=0;i0&&b[j+1]!=a[i+1])j=p[j];

if(b[j+1]==a[i+1])j++;

if(j==m)

{cout<>a+1)

{if(a[1]=='#')break;

cin>>b+1;

m=strlen(b+1);

n=strlen(a+1);

pre();

//cout《具體請看大佬寫的:

上:     第 34分鐘開始 

下:     

KMP演算法總結

kmp題目重在理解next陣列的含義 next陣列的作用 next j 記錄模式串中第 j 個字元的最長公共字首長度 重要,這是它的意義所在 第二種理解方式,當模式串與主串失配時,跳回的位置。next len 即字串 0 結束標誌的next值 單個字串匹配時與週期有關 hdu 1711 模板題 33...

KMP演算法總結

kmp演算法是用來實現模式匹配的,其時間複雜度是o m n 具體原理見 其中有用到next陣列來計算子串中公共項的位數,簡單來說,就是子串遇到不匹配時,就查next資料來決定前進幾位 移動位數 已匹配的字元數 對應的部分匹配值 1 要不要減一看next陣列第一位是不是為1,個人覺得加一後是有好處的,...

KMP演算法總結

現在假設有兩個字串a bbc abcdab abcdabde,b abcdabd。現在要在a中找b。比較暴力的方法是直接搜尋 void gosearch 上述 最核心就是while迴圈,舉兩個例子說明其作用 還是選取b串作為說明。假設現在要求next 6 那麼當前的j next 5 1 next陣列...