演算法 串的模式匹配演算法(KMP)

2022-01-12 12:24:44 字數 1468 閱讀 1039

串的模式匹配演算法

問題:求子串位置的定位函式如何寫? int index(sstring s,sstring t,int pos);

給定串s,子串t,問t在s中從pos位開始第一次出現的位置是?

我沒有使用字元陣列或者string,而是自己實現sstring,(這其實是資料結構作業)。s[0]中存放的是串的長度。

方法一:大暴力

1 #include2 #include3

#define maxstrlen 255

4 typedef unsigned char sstring[maxstrlen+1]; //

串的陣列表示;注意: 0號存放串的實際長度,故這裡是maxstrlen+1

5using

namespace

std;6/*

方法一:最簡單的直接暴力 複雜度o(len(s)*len(t))*/7

int index_simpal(sstring s,sstring t,int

pos)else19}

20if(j>t[0

])24

return0;

25 }

方法二:kmp演算法

維護乙個next陣列,next[i] 是下標1到i之間的串的最大公共字首字尾長度+1;

在方法一的基礎上,不把子串重新遍歷,而是從next[j] 處遍歷;

母串s不從上一次開始匹配的地方開始,而是從當前位置繼續;

具體看**以及注釋: 

1/*2

3而子串j下標,不從頭開始,而是從最大公共前字尾長度的下一位開始尋找

4這裡引入最大公共前字尾的概念 當前匹配點之前的前、字尾相同的最大數值

5next陣列就是+1

6自然計數

7next[1] = 0;8*/

9 #include10 #include11

#define maxstrlen 255

12 typedef unsigned char sstring[maxstrlen+1]; //

串的陣列表示;注意: 0號存放串的實際長度,故這裡是maxstrlen+1

13using

namespace

std;

14int next[100

];15

void

get_next(sstring t) else28}

29}3031

32int index_kmp(sstring s,sstring t,int

pos)else42}

43if(j>t[0

])47

else

return0;

48}4950

51int

main()

串的模式匹配演算法 KMP演算法

這個演算法理解起來有點難受,建議看下簡單的串模式匹配演算法bf演算法刷下經驗,如上鏈結。相比於brute force bf演算法 每當一趟匹配出現字元不等時,不需要回溯i指標 目標串指標 並且模式串指標j將從已經得到的部分匹配模式盡可能後移,從而降低時間消耗。o n m bf演算法為o n m 對於...

KMP 模式串匹配演算法

這兩天讀了july的kmp,覺得很受益,寫下以作備忘。kmp最重要的就是求出next陣列,而next陣列則是通過不斷比較 str2 k 與 str2 j 來確定下乙個字元對應的 next數值 相等則直接next j k 不相等則令k next k 進行遞推直到出現 str2 k str2 j 相等的...

串 KMP模式匹配演算法

樸素模式匹配演算法就是簡單的二重迴圈,第一重迴圈主串s從1到n,然後第二重迴圈子串t從1到m進行匹配判斷,時間複雜度為o n m 1 m kmp演算法的核心思想是 第一 如果子串前r個字元均不相等,且子串前r個字元與主串某連續的r個字元匹配,但子串第r 1就不匹配了,則主串的匹配下標可以直接向前跳r...