/**
* 希望能夠幫到學習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 中存放的是串的...