力扣第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の旅!
评论






