kmp演算法(模板)

2021-08-22 16:27:01 字數 898 閱讀 8085

kmp 演算法的關鍵在於初始化next[ ] 陣列

void getnext(char *b)

int  len=strlen(b); / / 待匹配字串的長度

next[0]=next[1]=0; / /初始化第乙個數和第二個數

for(int  i = 1; i < len ; i++){

int  j=next[i] ; / / 用 j 來記錄每次匹配失敗返回的位置

while ( j && b[i] ! =b[j] )

j = next[ j ]; / / 往前尋找相同字元,返回位置

next[ i + 1 ] = b[i]==b[i+1] ? j+1: 0; / / 如果找到與當前匹配字元相等的位置,在此位置+1

/ / 否則從0 開始匹配

有了 next[ ] 陣列 kmp 函式就很容易了

int    kmp(char *a  , char * b){

getnext();

int   l1=strlen(a), l2=strlen(b); / / l1為匹配字串長度 ,l2為待匹配字串長度

int   i , j =  0, ans=0;  / / j 用來記錄匹配長度

for(int i=0 ;i< l1; i++){

while ( j && a[i] ! = b[j] )

j = next [j] ;   / / 若匹配失敗,查詢next[ ] 陣列,返回重新匹配

if ( a[i] == b[j]) j++;  / / 匹配個數 

if ( j == l2 )  break;

if( j == l2) return i - l2 + 2; / /  若找到返回找到的位置

else  return  -1;  / / 若沒有找到返回 -1

KMP演算法(模板)

time limit 1000ms memory limit 65536k 有疑問?點這裡 給定兩個字串string1和string2,判斷string2是否為string1的子串。輸入包含多組資料,每組測試資料報含兩行,第一行代表string1 長度小於1000000 第二行代表string2 長...

KMP演算法模板

在文字t 1.n 中找到某個模式p 1.m 所有出現的位置被稱作字串匹配問題 m n p3375 模板 kmp字串匹配 這道題在洛谷上的評級居然是普及 普及?qvq 實現起來還是比較簡單的,只不過有很多細節可以有很多種寫法,看別人的 容易凌亂。理解起來比較困難的部分是如何get next 不建議初學...

kmp演算法模板

字串匹配樸素演算法 傳統的字串匹配 效率較低 計算主串中模式串出現的次數 include include using namespace std int index string s,string t else if j lent return count int main kmp演算法 下標從零開...