选择K个字母构建尽可能多的字符串 - 30万工资问题

问题描述 投票:0回答:1

我偶然发现了这个问题,但我无法解决它。非常感谢任何帮助。

给定一个由 N 个字符串和一个整数 K 组成的数组 S。从字母表中选择最多 K 个字母,这将允许您从数组 S 构建尽可能多的字符串。构建字符串时,任何选定的字母都可以多次使用。最多可以构建多少根字符串?

示例:

S = ["a","aa","ab","bb","bc","bd"] K = 1 answer = 2;  pick letter 'a' to build strings ["a","aa"]

我真的不知道如何解决这个问题......

arrays string algorithm dynamic-programming trie
1个回答
0
投票

首先,将 S 中的单词替换为其包含的已排序字母集。这需要 O(cN) 时间,其中 S 中单词的平均长度为 c。

现在用这些构造一个字典树。特里树的顶层是(已排序的)单词的第一个字母。下一级是第二个字母,依此类推。在 trie 的节点中,还存储有多少个单词恰好具有该节点表示的字母集。构造这个 trie 可以在 O(N) 时间内完成,例如只需从一个空 trie 开始并逐个插入单词即可。

trie 中的节点总数为 O(N) (每个单词的每个前缀可以有一个节点,但每个单词最多有 26 个唯一字母,因此 trie 大小的一个简单上限是 26N ).

给定 K,只需找到从根到最大深度 K 处的任何节点的最大值之和。这可以在 trie 的单次扫描中完成,因此时间为 O(N)。

我在这里假设大小为 26 的固定字母表,但我认为推广可变大小字母表的复杂性计算很容易。

© www.soinside.com 2019 - 2024. All rights reserved.