模式串 從 0 開始的KMP演算法

2022-02-19 12:42:43 字數 1207 閱讀 2445

/**

* 希望能夠幫到學習kmp的人

*/#include #include #include "kmp.h"

// kmp.h 內容

/*#define maxsize (255)

typedef struct sstring;

void next(sstring const *t);

extern int *next;

int indexof_kmp(sstring const *s, sstring const *t);

*/int *next; // 計算 next陣列

/** * 計算 0-based 模式串t的next陣列

* @param t 模式串

*/void next(sstring const *t)

for (int i = 0; i < length; i++)

// 執行下面的語句的時候, 一定有 i >= 2

int maxlen = 0; // 儲存最長公共前字尾的長度

/*** // len 表示字首或字尾的最大長度, 可取的值是 [1..i-1] // i 為(模式串或next陣列)的訪問下標

* 這裡主要是 對 模式串在i位置 求 它的最大公共前字尾的長度

* 從 1 開始 到 i-1 乙個乙個去試

* */

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

else

}if (flag == false) // 公共前字尾長度為len

val = len;

if (val > maxlen) // 這個比較不是必須的,因為找公共前字尾的長度的時候, len 從 1 到 i-1

maxlen = val; // maxlen 就是 next[i]的值了

}next[i] = maxlen;

}}// 呼叫這個函式之前,一定要呼叫 next函式,為模式串構建 next陣列

int indexof_kmp(sstring const *s, sstring const *t)

else

// 匹配成功

if (j == t->length)

}// 匹配失敗

return -1;

}

設計模式從0開始

做開發今年是第4年了,可是做的最多的是貼上和複製。把一段 從這個地方複製到另乙個地方,做一下修改就完成了乙個新的功能。又或者把乙個專案直接賦值過來改個名字就開始做乙個新專案。做完也就完了。完全是為了工作而工作,沒有經過太多的思考。也沒有花時間去回顧之前做的專案都有什麼共同點。久而久之學會的只有一些需...

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

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

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

串的模式匹配演算法 問題 求子串位置的定位函式如何寫?int index sstring s,sstring t,int pos 給定串s,子串t,問t在s中從pos位開始第一次出現的位置是?我沒有使用字元陣列或者string,而是自己實現sstring,這其實是資料結構作業 s 0 中存放的是串的...