串的模式匹配演算法問題:求子串位置的定位函式如何寫? 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/*23而子串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...