如何有效地重新排列字符串中的字符,以便没有对?

时间:2014-09-08 14:43:59

标签: arrays algorithm time-complexity

最多包含10 ^ 5个A..Z字符的字符串。任务是重新排列它,以便没有任何字符形成一行。对于多个解决方案,按字母顺序排在第一位的是正确的。当然,它必须在合理的时间内完成。

所以我尝试了两种方法,其中一种方法正确地重新排列,但效率非常低,另一种方法破坏了逻辑,我想。

进展缓慢。

  1. 对字符数组进行排序
  2. 重新排列到位,类似于插入排序(这就是为什么它如此慢)
  3. 不正确的方法(并不总是按字母顺序给出第一个答案)

    1. 排序
    2. 将元素从结尾移动到另一个数组,保持不变
    3. 反向
    4. 我真的被困住了,在这里想不出别的什么。

      示例:

      "HHABC" -> "ABHCH";
      "CBAXXXX" -> "XAXBXCX";
      "AAABBBCCCCCCCDDDDD" -> "ABABACBCDCDCDCDCDC";
      

      这是详细的模型求解算法。我想我不允许发布实际的代码,所以就像这样:

      1. 构建直方图。它可以存储在int数组中,索引是ascii-codes,因此不需要映射。
      2. 构建新字符串:
          每个字符的
        • 按字母顺序排列,从A到Z
        • 如果根据直方图没有这样的符号,请转到下一个
        • 如果先前的书面符号相同,则移至下一个(如果不是第一次迭代)
        • 写下第一个找到合适的角色
        • 减少直方图中的数字
        • 如果当前符号(长度为i + 2)/ 2(当前符号的一半),则从此循环中断并转到字符串中的下一个符号。
      3. 它比我最终编写的混乱更短更简单(虽然它工作得很好,非常感谢你的帮助)。

1 个答案:

答案 0 :(得分:1)

好点Paul R.如果您的直方图包含每个元素的出现次数,则可以按出现次数从高到低对这些桶进行排序。只要一个存储桶中的出现次数不大于存储桶的数量,您就应该能够形成可行的字符串。从最大的桶开始,循环遍历下一个最大桶中的每个桶,直到较小的桶。

例如,AAAAABBCRRSTT

AAAAA BB C RR S TT - > AAAAA BB RR TT C S

ABARATACASBRT