關於字串模糊匹配

2021-06-04 16:52:14 字數 1542 閱讀 1713

一種比kmp和bm

更高效的匹配演算法(如果想看原英文介紹,看下面分割線後的**)

適用於:模式串較短的情況,最壞時間複雜性為o(n*m),不過一般沒這麼壞

sunday演算法其實思想跟bm演算法很相似,只不過sunday演算法是從前往後匹配,在匹配失敗時關注的是文字串中參加匹配的最末位字元的下一位字元。如果該字元沒有在匹配串中出現則直接跳過,即移動步長= 匹配串長度+ 1;否則,同bm演算法一樣其移動步長=匹配串中最右端的該字元到末尾的距離+1。

**如下:

sunday-字串匹配演算法

--一種優於

kmp的演算法

思想類似於bm

演算法,只不過是從左向右匹配

遇到不匹配的看大串中匹配範圍之外的右側第乙個字元在小串中的最右位置

另外:採用bm/kmp

的預處理的做法,事先計算好移動步長,等到遇到不匹配的值直接使用

#include

#include

using namespace std;

//乙個字元8位 最大256種

#define max_char_size 256

/*設定每個字元最右移動步長,儲存每個字元的移動步長

如果大串中匹配字元的右側乙個字元沒在子串中,大串移動步長=

整個串的距離

+1如果大串中匹配範圍內的右側乙個字元在子串中,大串移動距離=

子串長度

-這個字元在子串中的位置

int *setcharstep(char *substr)

int *charstep=new int[max_char_size];

int substrlen=strlen(substr);

for(int i=0;icharstep[i]=substrlen+1;

//從左向右掃瞄一遍 儲存子串中每個字元所需移動步長

for(int i=0;icharstep[(unsigned char)substr[i]]=substrlen-i;

return charstep;

演算法核心思想,從左向右匹配,遇到不匹配的看大串中匹配範圍之外的右側第乙個字元在小串中的最右位置

根據事先計算好的移動步長移動大串指標,直到匹配

int sundaysearch(char *mainstr,char *substr,int *charstep)

int mainstrlen=strlen(mainstr);

int substrlen=strlen(substr);

int main_i=0;

int sub_j=0;

while(main_i//儲存大串每次開始匹配的起始位置,便於移動指標

int tem=main_i;

while(sub_jif(mainstr[main_i] ==   substr[sub_j])

main_i++;

sub_j++;

continue;                  

else

void qs(char *x, int m, char *y, int n) }

字串模糊匹配 根據萬用字元

在我們程式設計過程中,經常需要遇到字串和指定的模板匹配,需要返回是否匹配字串模板。其中符號 匹配任意多個位元組,匹配單個字元 模板形式舉例如下 1 010 010?用於判斷 號碼是否是010開頭。2 民主 用於判斷文字中是否含有敏感詞。3 銀行 信用卡 用於判斷文字中是否含有特殊的語義。我們需要用文...

Google字串模糊匹配演算法,字典樹模糊查詢

到東西,如下圖 那這個演算法是怎麼實現的呢,用到了一種高階資料結構 字典樹,或者說是字典樹思想,因為字典樹不規定你具體怎麼實現,可以二維陣列,可以map 也可以通常的結構體 next指標。可以通過乙個題來講述,就是2009acm icpc 哈爾濱 reginal現場賽g題 fuzzy google ...

C 實現的字串模糊匹配

c 基本沒有正規表示式功能,當然像boost裡提供了正則。本文 於園友的一篇文章,請看 很早之前就看過這篇文章,原作者的需求很明確 實現也很好。之所以又寫這篇文章,是因為原作者只介紹了在linux系統下直接呼叫系統函式fnmatch即可實現,而沒有考慮在windows在的使用。本人這週看了下goog...