1. 程式人生 > >關於字符串問題【KMP】

關於字符串問題【KMP】

基礎 是你 一道 不存在 最短 bsp 問題 多人 相等

今天重點學了學字符串,算是為以前的字符串恐懼癥填坑(想想一個KMP都背不熟的lz)

KMP很簡單,主要是維護p數組(定義:在一個字符串裏,1~p[i]這個串和i-p[i]+1~i這個串相等)對於字符串的匹配問題(求子串、公共前(後)綴)很常用,也是很基礎的算法了。

有一道簡單的KMP題:caioj1457
很多人秒切但是你知道為甚這樣套公式就行了嗎?
定理:假設S的長度為len,則S存在循環子串,當且僅當,len%(len-p[len])==0,最短循環子串為S[len-p[len]]
例子證明:
設S=q1q2q3q4q5q6q7q8,並設p[8]=6,
此時str=S[len-p[len]]=q1q2,

由p的定義可知,q1q2q3q4q5q6=q3q4q5q6q7q8,
即有q1q2=q3q4,q3q4=q5q6,q5q6=q7q8,
即q1q2為循環子串,且易知為最短循環子串。
由以上過程可知,若len%(len-p[len])==0,則S存在循環子串,否則不存在。

對於KMP兩串或多串匹配大佬肯定沒什麽問題了。

關於字符串問題【KMP】