字串匹配 雜湊演算法

2021-08-19 09:39:52 字數 1103 閱讀 4964

尋找字串s中字串t出現的位置或次數的問題屬於字串匹配問題。我們接下來討論中假設s的字串長度為 n,t的長度為m。最樸素的想法是,列舉所有起始位置,再直接檢查 是否匹配,複雜度為o(nm)的演算法。還有幾個為高效的演算法。而在此我們只介紹實現起來較為容易,而在一些稍作變化的問題中同樣適用,並且可以簡單地推廣到二維情況的雜湊演算法。

將雜湊演算法用於字串匹配的原理非常簡單。對於每個起始位置,我們不是o(m)地直接比較字串是否匹配,而是o(l)地比較長度為m的字串子串地雜湊值與t地雜湊值是否相等。雖然即使雜湊值相等也未必相等,但如果雜湊值是隨機分布地話,不同的字串雜湊值相等的概率是很低的,可以當作這種情況不會發生。

但是,如果我們採用o(m)的演算法計算長度為 m地字串子串地雜湊值的話,那複雜度還是o(nm)。這裡我們要使用乙個叫做滾動雜湊的優化技巧。選取兩個合適的互素常數b和h(l

#include

#include

using

namespace

std;

typedef

unsigned

long

long ull;

const ull b = 100000007;//雜湊的基數

//a 是否在 b中出現

bool contain(string a,string b)

return

false;

}

當然不光是右移一位,對於左移一位、左端或右端加長一位或是縮短一位的情況,也能夠進行類似處理。譬如說,假設要求s的字尾和t的字首相等地最大長度,可以利用滾動雜湊在o(n+m)的時間內高效地求得。

#include

#include

using

namespace

std;

typedef

unsigned

long

long ull;

const ull b = 100000007;//雜湊的基數

// a的字尾和 b的字首相等的最大長度

int overlap(string a,string b)

return ans;

}

雜湊 字串雜湊演算法

給定乙個長度為n的字串,再給定m個詢問,每個詢問包含四個整數l1,r1,l2,r2,請你判斷 l1,r1 和 l2,r2 這兩個區間所包含的字串子串是否完全相同。字串中只包含大小寫英文本母和數字。輸入格式 第一行包含整數n和m,表示字串長度和詢問次數。第二行包含乙個長度為n的字串,字串中只包含大小寫...

字串演算法 字串雜湊

方法以,m進製的形式來表示乙個字串,那麼這個字串就可以輕鬆計算 i j 之間的hash值 當只有小寫 大家字母時,m 131 而hash值,可以使用unsigned long long 來表示,這時不再需要求餘 方法應用 字串匹配。思路 對比hash值 允許k次失配的字串匹配 即 允許k次字元值不對...

字串匹配演算法 字串匹配演算法總覽

字串匹配在文字處理裡非常重要,我們採用簡潔的python 把以下演算法一一實現並講解。樸素演算法 algorithm rabin karp 演算法 有限自動機演算法 finite automation knuth morris pratt 演算法 kmp algorithm boyer moore ...