记华为 OD 技术面一手撕题
目录
注意
本文最后更新于 2024-03-11,文中内容可能已过时。
华为OD技术面一,手撕题正好遇到不太熟悉的前缀树。总体思路是想到了, 但是一些细节还是没有考虑到,比如:
- 想到用字典模拟树结构,但是没想到用嵌套字典,导致构造前缀树的 复杂度没有降下来。
- 想到要建立前缀树,但是还想在建树的同时进行连接词的判断,导致 建树的复杂度上升,有更多的细节问题需要考虑。应该将建树和判断连接词 分别考虑,遍历两次,这样既不需要按单词长度进行排序这步预操作,在代码 实现上也容易得多。
- 想到要对单词进行连接词判断,但是没有想到用递归的方式,和前两个欠 考虑之处有点关系。
- 一旦采用递归来判断连接词,那么各种优化操作也更容易实现,比如:
- 维护已知为连接词的单词集合,加速未处理单词的判断过程。
题目
描述:给你一个不含重复单词的字符串数组 words,请你找出并返回 words
中的所有连接词。
连接词:一个完全由给定数组中的至少两个较短单词组成的字符串。
提示:
1 <= words.length <= 1040 <= words[i].length <= 1000words[i] 仅由小写字母组成0 <= sum(words[i].length) <= 105
样例:
输入:words = ["cat", "cats", "catsdogcats", "dog", "dogcatsdog", "hippopotamuses", "rat", "ratcatdogcat"]
输出:["catsdogcats", "dogcatsdog", "ratcatdogcat"]
解释:
"catsdogcats" 由 "cats","dog" 和 "cats" 组成;
"dogcatsdog" 由 "dog","cats" 和 "dog" 组成;
"ratcatdogcat" 由 "rat","cat","dog" 和 "cat" 组成;
思路
遍历两次给定数组,第一遍构造前缀树,第二遍寻找连接词。
- 构造前缀树:用嵌套字典模拟树结构,用列表保存节点属性:嵌套字典表示的子树和 布尔值标识当前节点是否为单词结尾。
- 寻找连接词:递归回溯查找。
解答
|
|
相关内容
如果你觉得这篇文章对你有所帮助,欢迎赞赏~
