字串匹配經典算

2021-10-03 07:52:13 字數 1110 閱讀 5998

最近在刷資料結構,看到了字串匹配演算法kmp,bm,kp等,感覺是面試中應該要會的知識點,就先記錄下來了,方便之後的複習檢視:

1.kmp演算法

kmp演算法是在暴力演算法之上做了一些改進,不會重複的比對當前比對失敗的字首,即利用了匹配串本身的資訊來構造乙個查詢表next,該錶能夠指導當次匹配失敗下,如何對匹配串進行移動。可以省略掉一些重複比較的無用操作。

1.1next表構造

因為next表的構造其實本質也是字串的匹配,故其整體的框架和kmp相類似:

int* buildnext(const char* p)

else

t = n[t]; //把t往小的方向拉,匹配更小的真字首

} return n;

}

1.2.kmp演算法構造:

kmp的核心主要是1.1中的查詢表,當次匹配失敗時,能夠讓匹配串跳轉到適當的位置,從新開始匹配:

int kmpmatch(const char* p, const char* t)

else

j = next[j];

delete next;

return i - j;

}

1.3 next表改進

int* buildnext(const char* p)

else

t = n[t]; //把t往小的方向拉,匹配更小的真字首

} return n;

}

2.bm演算法

進一步的優化,採用壞字元和好字尾的策略。壞字元是利用字元匹配中的 「教訓」 來進行優化,好字尾是利用字元匹配的先驗知識 「經驗」來進行優化。兩者可以結合也可以分開實施優化。接下來分別的介紹壞字元bc和好字尾gs優化策略。

2.1壞字元表構造

int* buildbc(const char* p)

2.2基於壞字元的匹配演算法

int bmmatch(const char* p, const char* t)

delete bc;

return i;

}

面試經典 字串匹配問題

字串匹配問題描述 設有兩個字串a和b,a字串長度為n,b字串長度為m,現在要確定b字串是否出現在a字串中,如果是,返回位置,如果不是返回結果為false,在這裡,我們成字串b為模式字串,a為主串。最近經常會被問到字串匹配的問題,實際上這些問題在網上都有很多資源,我覺得沒有必要自己寫乙個,但是看了之後...

經典演算法 BF演算法(字串匹配)

字串的匹配演算法也是很經典的乙個演算法,在面試的時候常常會遇到,而bf演算法是字串模式匹配中的乙個簡單的演算法 bf演算法,即暴力 brute force 演算法,是普通的模式匹配演算法,思想簡單,結構也簡單 bf演算法的思想就是將目標串s的第乙個字元與模式串t的第乙個字元進行匹配,若相等,則繼續比...

字串匹配

題目描述 讀入資料string 然後讀入乙個短字串。要求查詢string 中和短字串的所有匹配,輸出行號 匹配字串。匹配時不區分大小寫,並且可以有乙個用中括號表示的模式匹配。如 aa 123 bb 就是說aa1bb aa2bb aa3bb都算匹配。輸入 輸入有多組資料。每組資料第一行輸入n 1 n ...