Python 字典树与字符串算法的应用
字典树是一种高效的字符串匹配数据结构,也称为 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 字典树与字符串算法的应用,希望能对你有所帮助!
相关文章