尋找字串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 ...