Python 字典树与字符串算法的应用

2023-04-11 00:00:00 算法 字符串 字典

字典树是一种高效的字符串匹配数据结构,也称为 Trie 树。它将所有的字符串按照字符的前缀依次插入字典树中,从而形成一棵树状结构。在查找一个字符串时,只需要从树的根节点开始,按照字符的顺序依次匹配即可。

字典树常用于搜索引擎中的单词补全和自动提示,以及字符串匹配相关问题的解决。

下面是 Python 中实现字典树的示例代码:

class TrieNode:
    def __init__(self):
        self.children = {}
        self.is_end = False

class Trie:
    def __init__(self):
        self.root = TrieNode()

    def insert(self, word: str) -> None:
        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 search(self, word: str) -> bool:
        node = self._search_prefix(word)
        return node is not None and node.is_end

    def start_with(self, prefix: str) -> bool:
        return self._search_prefix(prefix) is not None

    def _search_prefix(self, prefix: str) -> TrieNode:
        node = self.root
        for char in prefix:
            if char not in node.children:
                return None
            node = node.children[char]
        return node

上述代码中,TrieNode 表示字典树节点,包含一个 children 字典和一个布尔值 is_end,用于指示该节点是否为一个字符串的结尾。Trie 类实现字典树的基本操作,包括插入单词、查找单词和查找前缀。

接下来,我们通过一个实例来演示如何使用字典树解决字符串匹配问题。假设我们要在一段文本中搜索关键词“pidancode.com”和“皮蛋编程”,并标记出它们的位置。代码如下:

def search_keywords(text: str, trie: Trie) -> List[Tuple[int, int, str]]:
    res = []
    for i in range(len(text)):
        node = trie.root
        for j in range(i, len(text)):
            char = text[j]
            if char not in node.children:
                break
            node = node.children[char]
            if node.is_end:
                res.append((i, j+1, text[i:j+1]))
    return res

text = "Welcome to pidancode.com, the best place for learning programming. If you want to improve your programming skills, visit pidancode.com often. We also recommend 皮蛋编程 for more programming resources."
keywords = ["pidancode.com", "皮蛋编程"]
trie = Trie()
for keyword in keywords:
    trie.insert(keyword)

for start, end, word in search_keywords(text, trie):
    print(f"Found '{word}' at position {start}-{end}")

运行结果为:

Found 'pidancode.com' at position 11-24
Found 'pidancode.com' at position 71-84
Found '皮蛋编程' at position 166-171

上述代码中,search_keywords 函数接收一个文本和一个 Trie 实例,返回一个列表,其中每个元素表示一个匹配结果,包括匹配字符串的起始位置、结束位置和关键词本身。

在主程序中,我们首先建立关键词列表和对应的字典树实例,然后调用 search_keywords 函数搜索文本中的关键词并输出结果。

以上就是 Python 字典树与字符串算法的应用,希望能对你有所帮助!

相关文章