KMP 字串匹配

2021-08-08 07:55:57 字數 1685 閱讀 5742

十分好玩比較的函式kmp注釋

如果有乙個題目,說明的是在乙個母串之中找到乙個字串s出現了幾次的時候,問你輸出次數?

1.暴力,列舉每個位置  時間複雜度 o(n*m)

2.使用kmp 時間複雜度 o(m+n)

無需介紹吧!

直接上演算法!

#include 

using

namespace

std;

int main()

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

return

0;}

先上演算法,之後再來講解,呵呵!

#include 

#include

#include

#include

using

namespace

std;

const

int n=100005;

int p[n];

char s[n],t[n*10];

void getp(int n)

p[i]=++j;

}}int kmp(int n,int m)

j++;//ºóé¨ò»î»!!

if(j==n)

}return ret;

}int main()

}

對於乙個字串的匹配,如果找的了no.i的位置無法匹配,我們通常會開始繼續匹配,但是比如abababa,後來又來了ababca,很明顯,在s的char c位置出現了不夠匹配,但是,如果是暴力的話就是之後繼續判斷,但是可以相處乙個使得最大的字首和等於字尾和的是將,儲存在花掉匹配的i點記為p[i]就好了!,可能不會動,但是就附上吧!

那麼這麼預處理呢?

就是這個函式:

void getp(int n)

p[i]=++j;}}

p[0]此時的作用只是為了輔助p[1~len]的促成罷了,但是j=-1的初始化真的要好好的去理解啊!while迴圈的跳出條件就是

while(j>=0&&s[j+1]!=s[i])
那麼為什麼是這兩個資料呢

1.j>=0,就是說萬一根本沒有最長字首的事情,所以就跳出來,恰是-1,然後j++,就片尾了0,再賦值,之後就會使得i+1的位置是帶著p[i]=0,的情況下去去搜尋,去預處理,是不是很妙?

2.這是因為這個圖!

所以是while (s[i]!=s[j+1])

int kmp(int n,int m)

j++;

if(j==n)

}return ret;

}

只要還是注釋帶」*」號的地方,就是將來說如果匹配成功的話就繼續匹配,在p[j]的位置上下去就好了!,但是有一些題目j=0,為什麼?比如

剪花布條

因為這個題目是減下來的,也就是說剪掉就沒了!

注: 之後還有更多好玩的kmp玄學問題,暫等更新……

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串的第...