我最近在编码挑战中遇到了一个问题,我必须合并n个字母数字字符串,然后对新合并的字符串进行排序,同时只允许排序字符串中的字母字符。现在,这将是相当直接的,除了添加的警告是算法必须是O(n)(它没有指定这是时间或空间复杂性还是两者兼而有之)。
我最初的方法是将字符串连接成一个新字符串,只添加字母字符,然后在最后进行排序。我想提出一个更有效的解决方案,但我得到的时间少于我最初的时间。没有任何排序算法(我知道)在O(n)时间运行,所以我唯一能想到的是我可以增加空间复杂度并使用排序哈希表(例如C ++ map)存储每个字符的计数,然后按排序顺序打印哈希表。但由于这可能需要n次打印n个字符,我认为它仍然会在二次时间内运行。另外,我使用的是python,我认为它没有办法对字典进行排序(可能确实如此)。
无论如何,这个问题是否可以在O(n)时间和/或空间复杂度中得到解决?
答案 0 :(得分:2)
您的计数排序是的方法:按顺序为26个字母构建一个简单的计数表。迭代你的两个字符串,计算字母,忽略非字母。这是O(n)的一次通过。现在,只需通过您的表格,打印每个字母指示的次数。这也是O(n),因为计数的总和不能超过n
。您不打印n
个字母n
次:您正在打印总的n
个字母。
答案 1 :(得分:2)
由于每个步骤都是O(n),因此整个步骤是O(n)
[@ patatahooligan:在我看到你的评论之前做了这个编辑,不小心重复了答案]
答案 2 :(得分:1)
如果我已正确理解了这个要求,你只需要对字符串中的字符进行排序吗?
即。 ADFSACVB
成为AABCDFSV
?
如果是这样,那么诀窍就是不要真正“排序”。您有一个固定(和小)数量的值。因此,您只需保留每个值的计数并从中生成结果。
E.g。给定ABACBA
在第一遍中,递增由字符索引的数组中的计数器。这会产生:
[A] == 3 [B] == 2 [C] == 1
在第二次传递中输出计数器指示的每个字符的数量。 AAABBC
总而言之,您被告知 排序 ,但在盒子外面思考,您真的想要 计算 算法。