給定乙個目標串串t和若干個模式串p,設計乙個演算法去匹配每乙個模式串。
思路:多模式串匹配問題(設m為目標串的長度,n為模式串的平均長度)。可以用字尾trie樹,時間複雜度為o(m^2 + kn)。利用ac自動機的時間複雜度為o(m + kn + z)(其中z為t中出現的模式串個數)。還可以用字尾樹,字尾樹的方法比較複雜,這裡不做介紹。
下面是字尾trie樹的**
陣列形式:
#include #include #include using namespace std;
class trie
} void insert(const string& s) }
bool search(const string& s)
return true;
}};void main()
樹的形式:
以下是ac自動機**:#include #include #include #include using namespace std;
const int cld = 26;
struct tnode
};void insert(tnode*& root, const string& s)
temp = temp->pcld[j]; }}
bool search(tnode* root, const string& s)
return true;
}void main()
vectorsvec;
svec.push_back("is");
svec.push_back("sip");
svec.push_back("hi");
svec.push_back("sis");
svec.push_back("mississippa");
for (int i = 0; i < 5; ++i)
cout << search(root, svec[i]) << endl;
}
#include #include #include #include #include using namespace std;
const int cld = 26;
struct tnode
};void insert(tnode*& root, const string& s)
temp = temp->pcld[j];
} temp->tag = true;
}void build(tnode*& root) }}
int search(tnode* root, const string& s) }
return res;
}void main()
模式串匹配問題
問題描述 給出模式串p和文字串t 有以下問題 1 模式串是否出現在文字串。2 文字串中出現模式串的所有位置。3 模式串在文字串出現的次數。暫時想不出那麼多 對於上述的每個問題都可以逐個字元比較來找出答案。如下 for int i 0 i 顯然上述演算法的時間複雜度是o n m 對於k個模式串問題時,...
AC 自動機 多模式串匹配
上的敏感詞過濾是怎麼實現的呢?實際上,這些功能最基本的原理就是字串匹配演算法,也就是通過維護乙個敏感詞的字典,當使用者輸入一段文字內容後,通過字串匹配演算法來檢查使用者輸入的內容是否包含敏感詞。bf rk bm kmp 演算法都是針對只有乙個模式串的字串匹配演算法,而要實現乙個高效能的敏感詞過濾系統...
AC自動機(多模式串匹配)
虛線部分代表fail指標 ac自動機模板題鏈結 靜態陣列版本 推薦 量少易寫,更快易寫 include using namespace std class aho corasick 儲存結構 trie樹 void insert const char str cnt p void build fail...