問題描述:給定乙個字串集合s=,設計並實現乙個演算法,在給定文字中找出這些字串的不連續出現(不連續出現,例如「abdcdshfkajhg」這個文字中就包含了「abc」)。
一些多模式匹配演算法如:ac演算法,wm演算法等,都是去尋找給定的文字中是否包含目標字串,例如在乙個網頁中尋找多個敏感詞。然而,尋找的敏感詞必須在文字中是完整連續的。例如其中乙個目標字串為「abbc」,那麼「acbbc」是無法檢測到的。為了去尋找乙個非連續的目標字串,可以採用trie樹,也叫做字首樹來實現。
首先利用字串集合s構建乙個trie樹。
集合currentnodes記錄了待匹配的所有節點,初始值為trietree的根節點的子節點。然後對於讀取到的每乙個字元判斷是否在currentnodes集合中。如果不在則繼續判斷下乙個。如果在,判斷是否是結束字元。如果不是結束字元,則將該節點從currentnodes移除,將它的子節點加入。如果是結束字元,則將該字元對應的字串新增到結果中。
input1: trietree
input2: targetfile
set currentnodes = new set(trietree);
int max_gap=30;
while(targetfile.readchar.next!= null){
for node in currentnodes:
if targetfile.readchar.character == node.character && targetfile.readchar.order-node.order < max_gap:
if node.isend:
find a discontinuous string string;
else:
currentnodes.remove(node);
currentnodes.addall(node.childlist);
output: result.
字典樹 TrieTree 講解與實現
字典樹,又稱單詞查詢樹,trie樹 是一種 樹形結構 是一種雜湊樹的變種。典型應用是用於統計,排序和儲存大量的字串 但不僅限於字串 所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是 利用字串的公共字首來節約 儲存空間 最大限度地減少無謂的字串比較,查詢效率比 雜湊表高。字典樹與字典很相似,當你要查...
實現括號匹配演算法
括號匹配問題 假設乙個算術表示式中包含圓括號 方括號和花括號三種型別的括號,編寫乙個函式,用來判別表示式中的括號是否正確配對,並設計乙個測試主函式。演算法思想 在算術表示式中,右括號和左括號匹配的次序正好符合後到的括號要最先被匹配的 後進先出 堆疊操作特點,因此可以借助乙個堆疊來進行判斷。括號匹配共...
URL路徑匹配演算法實現
自定義的filter裡沒有excludepath,所以自己寫了乙個。開始寫的時候還把注意力放在路徑分隔符 上,後來發現完全沒必要。站在更抽象的層次上看無非都是字串而已。測試資料 匹配模式 如下 public static boolean matching string reg,string inpu...