自周四之後這兩天,沒怎麼系統的看,今天週六把作業,等等瑣事處理完了,明天一天沒有別的事,會系統的看看知識點。
今天把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陣列...