經典演算法之KMP演算法及其優化

2021-08-13 17:40:26 字數 1662 閱讀 4187

kmp演算法的具體分析見

/************************

author's email:[email protected]

date:2017.12.18

kmp演算法

************************/

#include

#include

using

namespace

std;

#define maxsize 50

void getnext(char substr, int next);//求next陣列

void getnextval(char substr, int nextval);//優化求next陣列

int kmp(char str, char substr, int next);//kmp演算法

int main() ;

int nextval[maxsize] = ;

int result1,result2;

//kmp演算法

getnext(substr, next);

result1 = kmp(str, substr, next);

cout

<< "kmp演算法匹配結果:"

<< endl;

if (result1 != -1)

cout

<< "主串與子串在主串的第"

<< result1 << "個字元(首字元的位置為0)處首次匹配"

<< endl;

else

cout

<< "無匹配子串"

<< endl;

//kmp演算法的優化

getnextval(substr, nextval);

result2 = kmp(str, substr, nextval);

cout

<< "kmp優化演算法匹配結果:"

<< endl;

if (result2 != -1)

cout

<< "主串與子串在主串的第"

<< result2 << "個字元(首字元的位置為0)處首次匹配"

<< endl;

else

cout

<< "無匹配子串"

<< endl;

return0;}

void getnext(char substr, int next)

else

j = next[j];

}}void getnextval(char substr, int nextval)

else

j = nextval[j];

}}int kmp(char str, char substr, int next)

else

j = next[j];

}if (j > strlen(substr) - 1)

return i - strlen(substr) ;

else

return -1;

}

程式測試結果:

以上如有錯誤請指出,大家共同學習進步。

KMP演算法及其優化

今天來記錄一下,關於字元匹配的kmp演算法。給定字串text和pattern,需要判斷字串pattern是否為test的子串。pattern一般稱為模式串,text為文字串。若匹配成功,則讓函式返回,匹配開始處的下標,否則,返回 1。假設有乙個字串s,它以i號位作為結尾的子串就是s 1 i 對該字串...

C 實現KMP演算法及其優化

自己寫了乙個簡潔版本,加注釋。第乙個函式是得到kmp的next陣列。1 設定next的第乙個值為 1。2 遍歷剩下的t串 3 t串前後比較,相等就在next中對應位置加1 4 不等,就回溯 t串中等價位置 void getnext string t,int next else j next j 第二...

經典演算法 KMP演算法詳解

內容 1 問題引入 2 暴力求解方法 3 優化方法 4 kmp演算法 1 問題引入 原始問題 對於乙個字串 str 長度為n 和另乙個字串 match 長度為m 如果 match 是 str 的子串,請返回其在 str 第一次出現時的首字母下標,若 match 不是 str 的子串則返回 1 注 子...