字串模式匹配

2021-08-25 02:43:04 字數 3198 閱讀 5650

bf演算法:

我們常用的暴力演算法,時間複雜度o(

n2) o(n

2)。**演示:

int bf(const

char *text, const

char *pattern)

if (flag) return

1; }

return

0;}

kmp演算法:

基於bf演算法的優化,他根據字串出現字首與字尾相同的情況進行優化

假設這裡sa、sb、ta、tb都相同,我們在這個位置失配,如在bf演算法,我們將ta與sa之後的第乙個字元進行匹配,這樣效率顯然很低,其實我們發現既然tb等於ta,那我們下一輪可以使用ta的下乙個字串與sb之後的第乙個字元匹配即可。

我們這裡要根據模式串計算乙個next陣列儲存模式串中每個字元對應的字首中字元位置,如若沒有則標記為-1。

kmp演算法的主要優點在於母串指標不會回溯。

**演示:

int kmp(const

char *text, const

char *pattern)

if (pattern[matrix + 1] == pattern[i])

next[i] = matrix;

}matrix = -1;

for (int i = 0; text[i]; ++i)

if (pattern[matrix + 1] == text[i])

if (pattern[matrix + 1] == 0) return

1; }

return

0;}

sunday演算法:

當我們在這個地方發生失配時,sunday演算法主要採用的是對齊法,然後模式串指標跳躍到這個字元最後出現的位置。

在這裡我們可以使用乙個陣列預處理模式串中每個字元最後出現的位置,那麼我們不妨直接計算出遇到每個字元母串應該跳躍的位置。 如果是模式串中沒有出現過的字元,那麼我們母串的指標應該向前跳躍多少步? 答案必然是 模式串長度 + 1

我們已經明確直到

t t

不在模式串中,所以我們的母串指標一定要跳到

t t

之後。如果當前字元是模式串第乙個字元,那麼我們母串的指標應該向前跳躍多少步? 答案必然是 模式串長度。

根據數學歸納法,我們可以推論實質上跳躍步數為 le

n−i len

−i。**演示:

int sunday(const

char *text, const

char *pattern) ;

for (int i = 0; i < 127; i++) ind[i] = len + 1;

for (int i = 0; pattern[i]; i++) ind[pattern[i]] = len - i;

for (int i = 0; i <= len2 - len;)

if (j == len) return

1; i += ind[text[i + len]];

}return

0;}

ac自動機演算法:

本質:字典樹 + kmp

資料結構用於資料表示

字典樹暴力匹配其實也較為優秀,大型企業主要採用的還是字典樹而非ac自動機,由於模式串增加後,重構fail指標較為麻煩。

新增fail指標的字典樹叫做ac自動機(nfa)。單邊關係轉化

ac自動機採用的是kmp的思想:母串指標不回溯。

在程式設計實現的過程中需要進行層次遍歷。採用佇列的資料結構,父節點為子節點分配fail指標。

**演示:

#include 

#include

#include

#define base 26

#define max_n 100000

#define bl 'a'

typedef

struct node node;

node* getnode()

void clear(node *node)

if (node->flag) free(node->str);

free(node);

return;

}node* insert(node *root, const

char* str)

p->flag = 1;

p->str = strdup(str);

return root;

}void build_ac(node* root)

if (p == null) else

queue[tail++] = node->next[i];}}

free(queue);

return;

}void search_ac(node *root, char *text)

}return;

}int main()

字串模式匹配

include include include include include includeusing namespace std inline unsigned int64 getclock const char min a const int characters 26 int shiftta...

字串模式匹配

子串的定位操作通常稱作串的模式匹配,是各種串處理系統中最重要的操作之一。設有2 個串 主串 s和子串 t,串的簡單模式匹配演算法是 從主串 s 中的第乙個字元開始和子串 t中的第乙個字元比較,分別用i和 j 指示s串和 t串中正在比較的字元的位置。若相等,則繼續逐個比較後續字元 否則從主串 s的第二...

字串模式匹配

2019 11 30 字串模式匹配 若兩個串長度相等且每個對應位置的字元都相等時,稱這兩個串 是相等的。1 define maxlen 255 2 typedef struct sstring 2 堆分配儲存表示 1 typedef struct 上面五個操作稱為最小操作子集 index s,t,p...