在O(n)

时间:2018-02-06 16:27:56

标签: python c++ string algorithm sorting

我最近在编码挑战中遇到了一个问题,我必须合并n个字母数字字符串,然后对新合并的字符串进行排序,同时只允许排序字符串中的字母字符。现在,这将是相当直接的,除了添加的警告是算法必须是O(n)(它没有指定这是时间或空间复杂性还是两者兼而有之)。

我最初的方法是将字符串连接成一个新字符串,只添加字母字符,然后在最后进行排序。我想提出一个更有效的解决方案,但我得到的时间少于我最初的时间。没有任何排序算法(我知道)在O(n)时间运行,所以我唯一能想到的是我可以增加空间复杂度并使用排序哈希表(例如C ++ map)存储每个字符的计数,然后按排序顺序打印哈希表。但由于这可能需要n次打印n个字符,我认为它仍然会在二次时间内运行。另外,我使用的是python,我认为它没有办法对字典进行排序(可能确实如此)。

无论如何,这个问题是否可以在O(n)时间和/或空间复杂度中得到解决?

3 个答案:

答案 0 :(得分:2)

您的计数排序的方法:按顺序为26个字母构建一个简单的计数表。迭代你的两个字符串,计算字母,忽略非字母。这是O(n)的一次通过。现在,只需通过您的表格,打印每个字母指示的次数。这也是O(n),因为计数的总和不能超过n。您不打印n个字母n次:您正在打印n个字母。

答案 1 :(得分:2)

  1. 连接你的字符串(不是真的需要,你也可以计算单个字符串中的字符)
  2. 创建一个长度等于charcodes总数nr的数组
  3. 读取您的连接字符串并计算在第2步中生成的数组中的出现次数
  4. 通过读取char freq数组,构建一个输出数组,每个char的重复次数为nr。
  5. 由于每个步骤都是O(n),因此整个步骤是O(n)

    [@ patatahooligan:在我看到你的评论之前做了这个编辑,不小心重复了答案]

答案 2 :(得分:1)

如果我已正确理解了这个要求,你只需要对字符串中的字符进行排序吗?

即。 ADFSACVB成为AABCDFSV

如果是这样,那么诀窍就是不要真正“排序”。您有一个固定(和小)数量的值。因此,您只需保留每个值的计数并从中生成结果。

E.g。给定ABACBA

在第一遍中,递增由字符索引的数组中的计数器。这会产生:

[A] == 3
[B] == 2
[C] == 1

在第二次传递中输出计数器指示的每个字符的数量。 AAABBC

总而言之,您被告知 排序 ,但在盒子外面思考,您真的想要 计算 算法。