KMP演算法學習筆記

2021-07-15 04:09:37 字數 1164 閱讀 3557

前幾天學習了關於字串處理的kmp演算法,剛學的時候沒怎麼懂,通過今天的練題,終於把kmp掌握了。

kmp演算法利用了字串的一些特殊性質,通過字首陣列,將單個字串的匹配問題由o(

m∗n)

優化到了o(

m+n)

。這裡,我存幾段關鍵性**。

首先是get_next()函式

void get_next()

}

然後是kmp()

void kmp()

else

if(j == m)

}printf("%d\n",cnt);//這是求子串個數

}

void kmp()

else j = next[j];

if(j == m)

}printf("%d\n",ans);//這是求第一次匹配的下標,ans = -1表示不能匹配

}

還有一類奇怪的問題,詢問一段字串的迴圈節,這就只需要在get_next()上改一點就好了

//-----poj2406-----這是求整個字串的迴圈節個數

int i = 0,j = -1;

next[0] = -1;

while(i != len)

int ans = 1;

if(len % (len - next[len]) == 0)

printf("%d\n",ans);

//-----poj1961-----這是求前i個字元中迴圈節的個數

printf("test case #%d\n",++t);

int i = 0,j = -1;

next[0] = -1;

while(i != len)

}else j = next[j];

}printf("\n");

留題備忘(附題解)

pku2406 power strings

pku1961 period

pku2752 seek the name, seek the fame

pku3461 oulipo

pku2185 milking grid

zjut1349 擲硬幣

Kmp演算法學習筆記

kmp演算法我認為難點在next陣列的建立。看kmp前我仔細看了下傳統的匹配模式,為 首元素存放串的長度 int index sstring s,sstring t else i i j 2 if j t 0 return i t 0 else return 0 我認為想深刻理解好kmp演算法要和傳...

KMP演算法學習筆記

kmp是一種字串匹配演算法,網上有許多的講解和介紹,都非常清楚明白,這裡只說明一點next i 表示 1,i 1 位中的最長公共字首字尾,因此在遇到字元不匹配時,直接將字串右移j next j 位即可。不多說了,直接上習題 poj 3461 oulipo kmp演算法裸題,直接上模板 code in...

KMP演算法 學習筆記

一種字串的快速匹配演算法 舉個栗子 找s2在s1中出現的位置 正常的做法 先從第乙個位置開始匹配,匹配到s2的最後一位時,發現不同,這時,把s2右移一位,再從頭開始匹配,如圖 如此匹配下去,直到 但是,我們可以看出,前面的三次匹配都是多餘的,我們可不可以直接跳到這一步呢?kmp演算法 我們一開始是匹...