KMP 計算模式串出現的次數

2021-06-26 10:11:26 字數 1970 閱讀 8229

參考資料:從頭到尾徹底理解kmp

實現**:#182538:solution

一、問題描述:

判斷一段文字(原串,str_src,長度為len_src)裡面是不是存在那麼一些特殊的文字(模式串,str_ptn,長度為len_ptn)?如若存在,計算該模式串出現的次數。

輸入:第一行乙個整數n,表示測試資料組數。接下來的n*2行,每兩行表示乙個測試資料。在每乙個測試資料中,第一行為模式串,由不超過10^4個大寫字母組成,第二行為原串,由不超過10^6個大寫字母組成。其中n<=20。

輸出:對於每乙個測試資料,按照它們在輸入中出現的順序輸出一行ans,表示模式串在原串中出現的次數。

樣例輸入:

5

hahahaha

wqnwqn

adaadadada

bababb

bababababababababb

dadaddaadaaddaaadaad

樣例輸出:

313

10

二、問題分析:

經典模式匹配問題。

基礎方法,窮舉法:從原串的各個位置開始與模式串進行比較,如若與模式串匹配則存在模式串,計數加1。但此時演算法複雜度為o(len_src*len_ptn)。

改進方法1,kmp:首先利用kmp演算法,得到模式串的next陣列,然後利用next進行匹配,如若匹配成功,則返回原串中起始匹配位置pos,計數加1,之後從原串pos+1處再次利用next進行匹配,直到匹配失敗。因為要計算模式串出現的次數,故此時演算法的最壞複雜度仍為o(len_src*len_ptn)。

改進方法2,kmp:對改進方法1,時間複雜度仍然很高,究其原因是未充分利用next陣列。每次匹配成功(原串匹配起始位置為pos)後下一次判斷匹配起始位置(為pos+1)取用有問題,應該如同簡單kmp方法一樣,不要回溯原串索引位置,而是利用next陣列,調整模式串的索引位置。設匹配成功時,原串索引起始位置為pos,則下次匹配判斷的原串起始索引位置應為pos+len_ptn,而模式串的起始索引位置應為next[len_ptn]。

三、演算法實現:

改進方法1,kmp:

#include#include#includeusing namespace std;

void get_next(const string &str_ptn,int *next);

int kmp(const string &str_ptn,const string &str_src,int pos,const int *next);

int my_kmp(const string &str_ptn,const string &str_src);

int main(int argc,char *argv){

string str_src,str_ptn;

int t;

cin>>t;

while(t--){

cin>>str_ptn>>str_src;

cout<

#include#include#includeusing namespace std;

void get_next(const string &str_ptn,int *next);

bool kmp(const string &str_ptn,const string &str_src,int &i,int &k,const int *next);

int my_kmp(const string &str_ptn,const string &str_src,int *next);

int main(int argc,char *argv){

int next[10001];

string str_src,str_ptn;

int t;

cin>>t;

while(t--){

cin>>str_ptn>>str_src;

cout<

使用KMP演算法求子串出現次數

1.kmp演算法 對應長度為n的目標串和長度為m的模式串,kmp演算法的複雜度是o m n 其中o m 的時間用於需找模式串的失效函式,o n 的時間用於匹配。演算法思想說起來比較麻煩,但是並不複雜,參考資料結構的書吧。2.下面給出kmp的 search 和子串出現次數 count 其中count ...

使用KMP演算法求子串出現次數

1.kmp演算法 對應長度為n的目標串和長度為m的模式串,kmp演算法的複雜度是o m n 其中o m 的時間用於需找模式串的失效函式,o n 的時間用於匹配。演算法思想說起來比較麻煩,但是並不複雜,參考資料結構的書吧。2.下面給出kmp的 search 和子串出現次數 count 其中count ...

計算字串中子串出現的次數

2.計算字串中子串出現的次數利用輸入函式輸入任意兩個字串,請編寫程式求出第二個字串在第乙個字串 現的次數,即在第乙個字串中有幾個第二個字串。例1 輸入123sdk123dfg123121 123輸出 3 例2 輸入 1wdfw112sfrtes wq輸出 0 include include int ...