字串匹配 KMP

2021-07-31 05:22:12 字數 1476 閱讀 1352

#include

#include

#include

using

namespace

std;

const

intmaxn =

10005;

intf[

maxn];

void

getf1(

string

p)//可判斷週期及迴圈數

f[i +

1] = p[

i] == p[

j] ? j + 1:

0; }

for(int

i =

1; i <= p.

size

(); i ++) }

cout

<<

endl;

}//getf1()

void

match1(

string

t,stringp)

if(t[i

] == p[

j]) if

(j == p.

size

()) }

}//match1()

void

getf3(

string

p)//據說省時

else

f[i] = j; }

else

j =

f[j]; }

}//getf3()

void

match3(

string

t,stringp)

else

j =

f[j]; if

(j == p.

size

())

} }

//match23()

intmain()

kmp就像dfs,只是方法,題意變化,需要技巧轉化。

poj1961

求給定字串s,前i個字元,是否存在是字串t的迴圈,迴圈次數k>1。求每種t的長度和k。

先求失配陣列f。若i失配,則回到f[i],則s[f[i]..i]是s[1..i]的某個字首,s[1..i]可能存在長度為(i - f[i])的字串迴圈。

(i - f[i]) * k = i得到i % (i - f[i]) = 0。

且k > 1,即f[i] > 0。

poj2752

給定字串s,求所有字串a,為s的字首字尾。即求所有k,使s[1..k] = s[sz - k + 1..sz]

失配陣列f.

q1 = f[sz],即s[1..q1] 與s[1..sz]最後q1個字元相同

q2 = f[q1],即s[1..q2] 與s[1..q1]最後q2個字元相同,即s[1..q2]與s[1..sz]最後q2個字元相同,即s[1..q2]同時為s的字首字尾。

以此類推,至q = f[qx] = 0,沒有乙個字元相同,退出。

kmp字串匹配

首先要對模式串進行預處理。預處理過程就是計算出指定位置的字首和字尾的最大相同的長度 啊啊啊啊。估計只有我乙個人能看懂 這個文章說得很清楚 比如說 a a a c b c a a a 0 1 2 0 0 0 1 2 3 void getnext int next,char par 20 int n 翻...

字串匹配 KMP

參考 從頭到尾徹底理解kmp 在字串 str 中 匹配模式串 pattern 1.計算模式串的 next 陣列 2.在字串中匹配模式串 當乙個字元匹配時,str i pattern k 繼續匹配下乙個字元 當當前字元不匹配時,根據 next 陣列移動模式字串,k next k next 陣列 描述模...

KMP字串匹配

判斷s中是否含有字串t。一般思路為 從s中首字元開始,依次與t中進行比對,直到t結尾或者某乙個位置兩者不同 如果到t的結尾,則表示s中含有t。如果有乙個位置不相同,那麼從s中下乙個字元開始,再次與t中字元比對。如下 i 0,j 0 for i len 這樣的比較,每一次遇到不同的時候都需要從t串的第...