bf:暴力匹配法o(n*m)
如果用暴力匹配的思路
並假設現在
文字串s匹配到 i 位置
模式串p匹配到 j 位置
則有:如果當前字元匹配成功(即s[i] == p[j])
則i++,j++,繼續匹配下乙個字元;
如果失配(即s[i]! = p[j])
令i = i - (j - 1),j = 0。
相當於每次匹配失敗時,i 回溯,j 被置為0。
s = "bbc abcdab abcdabcdabde"
p = "abcdabd"
1.bbc abcdab abcdabcdabde
abcdabd
2.bbc abcdab abcdabcdabde
abcdabd
3.bbc abcdab abcdabcdabde
abcdabd
bbc abcdab abcdabcdabde
abcdabd
4.bbc abcdab abcdabcdabde
abcdabd
5.bbc abcdab abcdabcdabde
abcdabd
6.bbc abcdab abcdabcdabde
abcdabd
7.bbc abcdab abcdabcdabde
abcdabd
kmp:可以實現複雜度為o(m+n)
下面先直接給出kmp的演算法流程
假設現在
文字串s匹配到 i 位置,
模式串p匹配到 j 位置
如果j = -1,或者當前字元匹配成功(即s[i] == p[j]),
都令i++,j++,繼續匹配下乙個字元;
如果j != -1,且當前字元匹配失敗(即s[i] != p[j]),
則令 i 不變,j = next[j]。
此舉意味著失配時,模式串p相對於文字串s向右移動了j - next [j] 位。
步驟:s = "bbc abcdab abcdabcdabde"
p = "abcdabd"
1.bbc abcdab abcdabcdabde
abcdabd
2.bbc abcdab abcdabcdabde
abcdabd
3.bbc abcdab abcdabcdabde
abcdabd
bbc abcdab abcdabcdabde
abcdabd
4.bbc abcdab abcdabcdabde
abcdabd
5.bbc abcdab abcdabcdabde
abcdabd
6.bbc abcdab abcdabcdabde
abcdabd
7.bbc abcdab abcdabcdabde
abcdabd
8.bbc abcdab abcdabcdabde
abcdabd
9.bbc abcdab abcdabcdabde
abcdabd
....
#include
#include
#include
#include
using namespace std;
const
int maxn=
1000
;int next[maxn]
;int plen,slen;
void
getnext
(char
*p,int plen)
else
j=next[j];}
}int
kmp(
char
*s,char
*p,int slen,
int plen)
else
j=next[j];if
(j==plen)
return i-j;
}return-1
;}intmain()
案例講解 資料的增刪改
1.執行以下指令碼建立表my employees use myemployees create table my employees id int 10 first name varchar 10 last name varchar 10 userid varchar 10 salary doubl...
kmp演算法講解
kmp演算法本身,解決的是判斷模板字串t,是否是字串s的子串的問題。當只需判斷子串首次出現的位置,或是否包含子串。可以用庫函式strstr s,t 代替,判斷t是否為s的子串來代替。該函式的返回值是t首次出現的位置,如果t不是s的子串則返回null。該函式的複雜度與kmp類似。kmp演算法主要分為兩...
KMP演算法講解
第一次寫部落格有點小激動,今天要講一下kmp演算法,這個查詢演算法比較難理解,我也是想了很久才想明白,我們在str2中的pos位置開始查詢str1,當找到的時候返回str2中的下標,沒有找到的時候返回 1 首先我們來參考一下我們最初寫的查詢字串的函式,定義i 0為str2的下標,j 0為str1的下...