KMP演算法C 實現

2021-10-07 04:44:17 字數 1039 閱讀 9817

kmp演算法的核心是利用比較過的匹配失敗後的資訊,主串指標不需要回溯,僅將子串向後滑動乙個合適的位置,並從該位置開始和主串進行比較,該位置僅取決於子串本身,利用子串獲得next陣列,用於失配時子串滑動,kmp通過儘量減少模式串與主串的匹配次數以達到快速匹配的目的。

在子串中求得next陣列,假設在next[j]已經求得的情況下,若子串中字元tj等於ti,j為當前t最長相等前字尾長度,則next[i+1] = j+1,若tj不等於ti,將ti-j+1…ti作為主串,t1…tj作為子串,類似於失配時,移動子串,即j = next[j],繼續比較求解next陣列直到比較結束

void

getnext

(string t, vector<

int>

& next)

else

}}

/*

author : eclipse

email : [email protected]

time : sun jun 14 17:18:17 2020

*/#include

using

namespace std;

void

getnext

(string t, vector<

int>

& next)

else}}

intkmp

(string s, string t,

int pos)

else

if(j ==-1

)}return j >= t.

size()

? i - t.

size()

:-1;

}int

main

(int argc,

char

const

*ar**)

datastructure

struct

4
《王道考研資料結構》

KMP演算法c 實現

遞推求解next陣列,初始的情況是next 0 1.假設在某乙個時刻有如下的等式成立 str 0.k 1 str j k.j 1 那麼next j k,在這個前提下,繼續進行下乙個字元的匹配.1 如果str 0.k str j k.j 那麼next j 1 next j 1 k 1.2 反之,如果上...

KMP演算法C實現

這種演算法是d.e.knuth 與v.r.pratt和j.h.morris同時發現的,因此人們稱為kmp演算法。此演算法可以在o n m 的時間數量級上完成串的模式匹配操作。其基本思想是 每當匹配過程中出現字串比較不等時,不需回溯i指標,而是利用已經得到的 部分匹配 結果將模式向右 滑動 盡可能遠的...

KMP演算法C 實現

kmp演算法事模式匹配的高效演算法,很少,但是卻不是很容易理解。這幾天剛好做了一些這方面的調研,寫了乙個c 實現版本的kmp演算法,貼出來亮亮。其實kmp演算法最重要的部分是next陣列的計算方法,這裡有一篇講解得非常到位的文章 而再計算完next陣列之後實現模式的匹配就簡單多了,基本得策略與計算n...