算法修仙传 第八章 古墓探险:Trie树寻宝

第八章 古墓探险:Trie树寻宝

上古剑仙墓穴开启,墓门机关浮现一行古篆:“唯有通晓前缀之道,方能得见真传”。林玄发现墓室墙壁上刻满各种剑诀前缀。

字典树奥秘

class TrieNode:
    def __init__(self):
        self.children = {}  # 子节点字典
        self.is_end = False # 标记是否为单词结尾

class Trie:
    def __init__(self):
        self.root = TrieNode()
    
    def insert(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 search(self, word):
        node = self.root
        for char in word:
            if char not in node.children:
                return False
            node = node.children[char]
        return node.is_end
    
    def startsWith(self, prefix):
        node = self.root
        for char in prefix:
            if char not in node.children:
                return False
            node = node.children[char]
        return True

【核心特性】

  1. 前缀共享节省空间
  2. 查找时间复杂度O(L),L为单词长度
  3. 适合自动补全场景

墓室挑战

  1. 破解剑诀密码(单词搜索II):
def find_words(board, words):
    def dfs(node, i, j, path):
        if node.is_end:
            res.add(path)
        
        tmp = board[i][j]
        board[i][j] = '#'
        for x, y in [(i+1,j),(i-1,j),(i,j+1),(i,j-1)]:
            if 0<=x<m and 0<=y<n and board[x][y] in node.children:
                dfs(node.children[board[x][y]], x, y, path+board[x][y])
        board[i][j] = tmp
    
    trie = Trie()
    for word in words:
        trie.insert(word)
    
    res = set()
    m, n = len(board), len(board[0])
    for i in range(m):
        for j in range(n):
            if board[i][j] in trie.root.children:
                dfs(trie.root.children[board[i][j]], i, j, board[i][j])
    return list(res)
  1. 寻找最长剑诀前缀:
def longest_common_prefix(words):
    if not words:
        return ""
    
    trie = Trie()
    for word in words:
        trie.insert(word)
    
    prefix = ""
    node = trie.root
    while len(node.children) == 1 and not node.is_end:
        char = next(iter(node.children))
        prefix += char
        node = node.children[char]
    return prefix
  1. 剑诀自动补全系统:
def autocomplete(prefix, trie):
    node = trie.root
    for char in prefix:
        if char not in node.children:
            return []
        node = node.children[char]
    
    res = []
    stack = [(node, prefix)]
    while stack:
        curr_node, curr_prefix = stack.pop()
        if curr_node.is_end:
            res.append(curr_prefix)
        for char, child in curr_node.children.items():
            stack.append((child, curr_prefix + char))
    return res

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tee xm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值