力扣第415场周赛
力扣第 415 场周赛
A
模拟+哈希。
1 | class Solution { |
B
dp
,定义为前i
个数字里面用了j
个。
1 | using ll=long long; |
C
1 | //定义Trie和查询最长前缀操作 |
代码解释
1. 定义 Trie
和查询最长前缀操作
1 | struct TrieNode { |
TrieNode
结构体表示前缀树的一个节点,包含 26 个子节点指针(对应字母 a-z)。Trie
类:包含插入单词和搜索最长前缀的功能。insert
方法:将单词插入前缀树。search
方法:从target
字符串的指定位置pos
开始,查找从当前位置开始的所有可能有效前缀的长度。
2. 主代码实现
1 | class Solution { |
minValidStrings
方法:- 初始化:
- 创建一个
Trie
对象。 - 初始化一个动态规划数组
dp
,大小为n+1
(其中n
是目标字符串target
的长度)。dp[i]
表示形成target
的前i
个字符所需的最小字符串数量,初始值为INT_MAX
,表示不可达,dp[0] = 0
表示从空字符串开始不需要任何字符串。
- 创建一个
- 构建前缀树:
- 遍历所有的单词,将它们插入到前缀树中。
- 动态规划更新:
- 遍历每个位置
i
,如果dp[i]
不是INT_MAX
(即可以到达位置i
),则从位置i
开始,利用前缀树查找所有可以匹配的有效前缀的长度。 - 对于每个有效前缀长度
len
,更新dp[i + len]
,即从i
到i + len
形成的字符串的最小数量。这里dp[i + len] = min(dp[i + len], dp[i] + 1)
表示选择最小的字符串数量。
- 遍历每个位置
- 返回结果:
- 如果
dp[n]
仍然是INT_MAX
,表示无法形成目标字符串,返回 -1。 - 否则,返回
dp[n]
,即形成目标字符串所需的最小字符串数量。
- 如果
- 初始化:
示例解释
示例 1:
words = ["abc","aaaaa","bcdef"]
和target = "aabcdabc"
,根据给定单词可以形成目标字符串所需的最少字符串数量为 3("aa" + "bcd" + "abc")。示例 2:
words = ["abababab","ab"]
和target = "ababaababa"
,可以通过两个 "ababa" 形成目标字符串。示例 3:
words = ["abcdef"]
和target = "xyz"
,目标字符串无法由任何前缀形成,返回 -1。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Totoroの旅!
评论