關於字串的匹配之古典匹配到引入KMP演算法

2021-08-30 06:29:13 字數 2215 閱讀 1274

最近在學習資料結構,學到了串與字串那個地方,一般都是求子串在主串中的定位問題:

古典的方法一般都是採用子串定長順序儲存結構,可以寫出不依賴於其他串的操作的匹配演算法,這種演算法在二進位制中的算術複雜度非常高,最壞情況下為o(n*m),但是我個人覺得在不是二進位制中應該也還好,這個演算法的核心實際上就是將子串固定死,然後乙個下標i在主串中移動,或者就是利用一下i=i-j+2,然後j又回到等於1,然後如果說最後j能夠大於子串的長度,那麼i減掉子串的長度就是子串此時在主串中的索引;

下面可以給出他的這個函式演算法:

#include#include#include#include#include#include#include#includeusing namespace std;

void index(string s1,string s2,int pos) else

}int main()

而這個時候我們可以引進來kmp演算法來優化解題:

kmp演算法實際上是由get_next(string s2,int next)和index_kmp(string s1,string s2,int pos)兩個函式組成,

這個next函式實際上是對模式串進行操作,跟主串完全沒有關係的,在next[1]=0,next[2]=1,這兩個實際上就是固定的,我們這樣在紙上是可以直接列出來的,但是怎麼寫出自動判斷next【j】的值呢:

void get_next(string s3,int next)  else 

}} //get_next

然後下面給出index_kmp演算法函式:

int index_kmp(string s1,string s2,int pos)  else 

if(j > s2.length())

}}

下面再以一道題目來解釋吧:

time limit: 1000ms   memory limit: 65536k  有疑問?點這裡^_^

給定兩個字串string1和string2,判斷string2是否為string1的子串。

輸入包含多組資料,每組測試資料報含兩行,第一行代表string1,第二行代表string2,string1和string2中保證不出現空格。

對於每組輸入資料,若string2是string1的子串,則輸出"yes",否則輸出"no"。

abc

a123456

45abc

ddd

yes

yesno

**如下所示:

#include#includeusing namespace std;

char s[100],t[100];

int s,t,next[100],nextval[100];

void get_next(char t,int next);//對應模式匹配演算法一next函式值

void get_nextval(char t,int nextval);//對應模式匹配演算法二nextval函式值

int index_kmp(char s,char t,int pos);//模式匹配演算法一

int index_kmp2(char s,char t,int pos);//模式匹配演算法二

int main()

int index_kmp2(char s,char t,int pos)//模式匹配演算法二

else j=nextval[j];

}if(j>t)return i-t;

else return 0;

}

還有一道題目是南陽oj上面的,題目的基本意思是問你在主串中,子串出現的次數:

下面是**:

#include#include#include#include#include#includeusing namespace std;

int main() else

} cout << cnt << endl;

}}

#include#includeusing namespace std;

int main()

cout<

}}

由字串匹配到KMP演算法

字串匹配問題就是在指對於兩段字串,待匹配串和模式串,尋找待匹配串中模式串是否出現,及出現的位置。例如在文字編輯中,我們經常要在一段文字中某個特定的位置找出某個特定的字元或模式。1 簡單字串匹配 bf brute force演算法 這個演算法簡單粗暴,就是從左邊對齊乙個個字元對比,相同就對比下一位,不...

關於字串模糊匹配

一種比kmp和bm 更高效的匹配演算法 如果想看原英文介紹,看下面分割線後的 適用於 模式串較短的情況,最壞時間複雜性為o n m 不過一般沒這麼壞 sunday演算法其實思想跟bm演算法很相似,只不過sunday演算法是從前往後匹配,在匹配失敗時關注的是文字串中參加匹配的最末位字元的下一位字元。如...

正則匹配字串無匹配不到 字串匹配演算法

我們先說下定義,比如說我們要在a字串中查詢字串b,那麼a就是主串,b就是模式串 我們把主串的長度記為n,把模式串的長度記為m,n m bf brute force 中文名 暴力匹配演算法,樸素匹配演算法 簡單的說bf的演算法就是在主串中查詢起始位置是0,1,2,n m個且長度為m的n m 1個子串,...