def __init__(self):
self.children = {}
self.fail = None
self.is_end = False
class AhoCorasick:
def __init__(self):
self.root = TrieNode()
def add_word(self, word):
node = self.root
for char in word:
if char not in node.children:
node.children[char] = TrieNode()
node = node.children[char]
node.is_end = True
def build_fail(self):
queue = []
for child in self.root.children.values():
child.fail = self.root
queue.append(child)
while queue:
current = queue.pop(0)
for char, child in current.children.items():
fail_node = current.fail
while fail_node and char not in fail_node.children:
fail_node = fail_node.fail
if fail_node:
child.fail = fail_node.children.get(char, self.root)
else:
child.fail = self.root
queue.append(child)
def search(self, text):
results = []
current = self.root
for i, char in enumerate(text):
while current and char not in current.children:
current = current.fail
if not current:
current = self.root
else:
current = current.children[char]
temp = current
while temp != self.root:
if temp.is_end:
# 这里可以根据需求记录匹配到的单词或者位置
results.append((i, temp))
temp = temp.fail
return results
写算法快多了