我偶然发现了这个问题,但我无法解决它。非常感谢任何帮助。
给定一个由 N 个字符串和一个整数 K 组成的数组 S。从字母表中选择最多 K 个字母,这将允许您从数组 S 构建尽可能多的字符串。构建字符串时,任何选定的字母都可以多次使用。最多可以构建多少根字符串?
示例:
S = ["a","aa","ab","bb","bc","bd"] K = 1 answer = 2; pick letter 'a' to build strings ["a","aa"]
我真的不知道如何解决这个问题......
首先,将 S 中的单词替换为其包含的已排序字母集。这需要 O(cN) 时间,其中 S 中单词的平均长度为 c。
现在用这些构造一个字典树。特里树的顶层是(已排序的)单词的第一个字母。下一级是第二个字母,依此类推。在 trie 的节点中,还存储有多少个单词恰好具有该节点表示的字母集。构造这个 trie 可以在 O(N) 时间内完成,例如只需从一个空 trie 开始并逐个插入单词即可。
trie 中的节点总数为 O(N) (每个单词的每个前缀可以有一个节点,但每个单词最多有 26 个唯一字母,因此 trie 大小的一个简单上限是 26N ).
给定 K,只需找到从根到最大深度 K 处的任何节点的最大值之和。这可以在 trie 的单次扫描中完成,因此时间为 O(N)。
我在这里假设大小为 26 的固定字母表,但我认为推广可变大小字母表的复杂性计算很容易。