前幾天學習了關於字串處理的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演算法 我們一開始是匹...