[英]Merging and sorting n strings in O(n)
最近,我在编码挑战中遇到一个问题,我必须合并n个字母数字字符的字符串,然后对新的合并字符串进行排序,而只允许在排序的字符串中使用字母字符。 现在,这将是相当简单的,除了增加的警告是算法必须为O(n)(它没有指定这是时间还是空间复杂性,还是两者都没有)。
我最初的方法是将字符串连接成一个新字符串,只添加字母字符,然后在末尾排序。 我想提出一个更有效的解决方案,但是给我的时间少于最初告诉我的时间。 (我所知道的)没有在O(n)时间内运行的排序算法,所以我唯一能想到的是我可以增加空间复杂度并使用排序的哈希表(例如C ++映射)进行存储每个字符的计数,然后按排序顺序打印哈希表。 但这可能需要n次打印n个字符,因此我认为它仍将以二次时间运行。 另外,我使用的是python,但我认为它没有办法使字典保持排序(也许可以)。
无论如何,是否可以在O(n)时间和/或空间复杂度中解决此问题?
您的计数排序是要走的路:建立了26个字母的简单计数表中的顺序。 遍历两个字符串,计算字母,忽略非字母。 这是O(n)的一遍。 现在,只需遍历表格,按指示的次数打印每个字母。 这也是O(n),因为计数的总和不能超过n
。 您不会每次打印n
字母n
: 总共要打印n
字母。
因为每个步骤都是O(n),所以整个事情都是O(n)
[@patatahooligan:在我看到您的评论之前进行了此编辑,不小心重复了答案]
如果我正确理解了要求,那么您只是在对字符串中的字符进行排序?
即ADFSACVB
变为AABCDFSV
?
如果是这样,那么诀窍就是不要真正“排序”。 您有固定数量的值。 因此,您只需对每个值进行计数并从中生成结果。
例如,鉴于ABACBA
在第一遍中,在由字符索引的数组中增加一个计数器。 这将产生:
[A] == 3 [B] == 2 [C] == 1
在第二遍输出中,计数器指示的每个字符的编号。 AAABBC
总而言之,系统会告诉您进行排序 ,但要跳出框框思考,您确实需要计数算法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.