KMP字串匹配。。學習。

2021-07-26 18:32:54 字數 1280 閱讀 6234

這個演算法時間複雜度o(m+n) 

不回溯例如 a c b  c a c b 

-1 0 0 1 0 1 2  這個是next陣列  當你每次匹配失敗時候。。這個匹配串的作用 例如 當時是下標是j,匹配失敗了, 就要回到next[j-1]+1 。。你失敗那個位置之前一步肯定沒失敗吧 不然就不匹配到這了,然後就回到上一步那個位置等效的乙個位置。。就是next[當前位置-1] 但是你要從下乙個才開始匹配嘛。這個已經失敗了,等效的位置還是失敗 但是這個next[j-1]之前的就不用匹配了,這裡就省了時間 然後你從下乙個開始匹配 那就是j=next[j-1]+1

怎麼求這個next喃

void makenext(const string&p,int next)

next[0]=-1;//這個。。我覺著是終止條件

for(int i=1 ;iint j=next[i-1];//上乙個數的回去的等效位置

while(p[j+1] != p[i] && j >=0)//j +1 才是開始匹配的地方 所以就是j+1 i  j>=0是沒到下標為0

j=next[j]; //上乙個數的回去的等效位置

if(p[i] == p[j+1])next[i]=j+1; j+1這個位置等效,next[i]就等於j+1

else next[i]=0; //沒有等效的 那就是0

嗯 next陣列有了。

思路: 匹配失敗就next[當前位置-1]+1

完整馬hpp

#ifndef  h_hpp

#define h_hpp

#include #include #include #include using namespace std;

template class match

; ~match(){};

void seetheans();

void makenext(const string&p, vector&next);

bool kmp(const string&s, const string &p);

private:

string s;

string p;

};templatevoid match::makenext(const string&p, vector&next)//構建next陣列

if (p[i]==p[j+1])

else

}}templatebool match::kmp(const string&s, const string &p)

#endif //h_hpp

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