改良的KMP字串模式匹配演算法

2021-06-25 07:22:56 字數 935 閱讀 8100

kmp演算法是使用了next陣列,改良後的在next陣列基礎上進行2次模式參照,某乙個字元與模式串不匹配則沿用其前一位字元的next值

由於清華版的《資料結構(c語言版)》的類c**使用的是下標從0開始,0作為長度儲存位,與實際的c/c++標準庫不一樣,所以講其改為純c/c++標準實現,使用std庫的string類,由此引發了陣列下標的問題。在使用string庫的迭代器進行定位字元的話,可以將0對應為begin(),-1對應為begin()-1,(即越下界)。

當nextval為-1時,則主串應該向右滑動,同時模式串置為初始狀態index=0。

原kmp演算法原理:

next[j] = 

改良的kmp則在max集合儲存有效比較資訊,公式1:假如p(k) = p(j),則nextval[j+1] =next[j]+1;若不等,則模式串應該向右滑動(即自身下標減小),直至滿足公式1,實在尋找不到合適的則

// kmp.cpp : 定義控制台應用程式的入口點。 //

#include "stdafx.h"

#include

#include

using namespace std;

void getnextval(const string t,int * nextval)

else

} else

} }//getnextval

bool index_kmp(const string &s,const string &t,int&targetindex,int beginpos = 0)

else

} delete nextval;

if (j>=t_size)

else

}//index_kmp

int _tmain(int argc, _tchar* argv)

字串模式匹配KMP演算法

next的值去改變每次匹配的位置 注意 字串的儲存最好用字元陣列,然後用字元輸入的形式,保證正確!利用求模式串的next值來分析遍歷,可以在不改變主串i的值的基礎上,只改變next j 的下標來遍歷 next j include include using namespace std void ge...

字串模式匹配KMP演算法

字串模式匹配指的是,找出特定的模式串在乙個較長的字串中出現的位置。很直觀的可以寫出下面的 來找出模式串在乙個長字串中出現的位置。1 2 樸素的模式匹配演算法 3 功能 字串的模式匹配 4 引數 5 s 目標串 6 p 模式串 7 pos 開發匹配的位置 8 返回值 9 匹配成功,返回模式串在目標串的...

字串模式匹配KMP演算法

字串模式匹配指的是,找出特定的模式串在乙個較長的字串中出現的位置。很直觀的可以寫出下面的 來找出模式串在乙個長字串中出現的位置。1 2 樸素的模式匹配演算法 3 功能 字串的模式匹配 4 引數 5 s 目標串 6 p 模式串 7 pos 開發匹配的位置 8 返回值 9 匹配成功,返回模式串在目標串的...