当前位置:实例文章 » C#开发实例» [文章]Leetcode 第 354 场周赛 Problem D 最长合法子字符串的长度(Trie + 枚举最远距离)

Leetcode 第 354 场周赛 Problem D 最长合法子字符串的长度(Trie + 枚举最远距离)

发布人:shili8 发布时间:2024-12-27 06:46 阅读次数:0

**Problem D: 最长合法子字符串的长度**

在 LeetCode 的第354 场周赛中,问题 D 需要我们求出给定一个 Trie(前缀树)中的最长合法子字符串的长度。这个问题涉及到 Trie 的构建和枚举最远距离的思想。

**Trie 的定义**

Trie 是一种用于存储和检索字符串集合的数据结构。它是一棵多叉树,每个结点代表一个字符,根结点代表空字符串。每个结点都有一个指向子结点的链表,表示该结点可以接续的字符。

**问题描述**

给定一个 Trie,其中每个结点都有一个值(0 或1),我们需要找到最长合法子字符串的长度。一个子字符串是合法的,如果它从根结点开始,并且所有结点的值都是1。

**解决方案**

我们的解决方案涉及到两步:

1. 构建 Trie 并计算每个结点的最大深度(即最远距离)。
2. 使用 Trie 的结构枚举最长合法子字符串并计算其长度。

### 步骤1:构建 Trie 和计算最大深度我们首先需要构建 Trie,并为每个结点计算其最大深度。这个过程可以使用一个 Trie 结点类来实现,例如:

class TrieNode:
 def __init__(self):
 self.children = {}
 self.max_depth =0


然后,我们可以使用一个函数来构建 Trie 和计算最大深度:

def build_trie(words):
 root = TrieNode()
 for word in words:
 node = root for char in word:
 if char not in node.children:
 node.children[char] = TrieNode()
 node = node.children[char]
 node.max_depth = max(node.max_depth,1 + node.max_depth)
 return root


### 步骤2:枚举最长合法子字符串和计算长度现在,我们需要使用 Trie 的结构枚举最长合法子字符串并计算其长度。这个过程可以使用一个函数来实现,例如:

def longest_valid_substring(root):
 max_length =0 for node in root.children.values():
 if node.max_depth ==1:
 length =1 + longest_valid_substring(node)
 max_length = max(max_length, length)
 return max_length


### 完整代码完整的代码如下:

class TrieNode:
 def __init__(self):
 self.children = {}
 self.max_depth =0def build_trie(words):
 root = TrieNode()
 for word in words:
 node = root for char in word:
 if char not in node.children:
 node.children[char] = TrieNode()
 node = node.children[char]
 node.max_depth = max(node.max_depth,1 + node.max_depth)
 return rootdef longest_valid_substring(root):
 max_length =0 for node in root.children.values():
 if node.max_depth ==1:
 length =1 + longest_valid_substring(node)
 max_length = max(max_length, length)
 return max_length# 测试用例words = ["abc", "bcd", "cde"]
trie_root = build_trie(words)
print(longest_valid_substring(trie_root))


这个代码首先构建 Trie,然后使用 Trie 的结构枚举最长合法子字符串并计算其长度。测试用例中,我们提供了一个包含三个单词的列表,分别是 "abc"、"bcd" 和 "cde"。然后,我们使用 `build_trie` 函数构建 Trie,并使用 `longest_valid_substring` 函数枚举最长合法子字符串并计算其长度。

**注意**

这个代码仅供参考,请自行测试和调试以确保其正确性。

其他信息

其他资源

Top