#

19 阅读1分钟
    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

写算法快多了