【发布时间】:2014-11-01 19:57:33
【问题描述】:
最多有 10^5 个 A..Z 字符的字符串。任务是重新排列它,以便没有一个字符形成一行。对于多种解决方案,按字母顺序排在第一位的解决方案是正确的。当然,它必须在合理的时间内完成。
所以我尝试了两种方法,其中一种重新排列正确但效率非常低,我猜另一种逻辑错误。
慢慢接近。
- 对字符数组进行排序
- 原地重新排列,类似于插入排序(这就是它这么慢的原因)
不正确的方法(并不总是按字母顺序给出第一个答案)
- 排序
- 将元素从末尾开始移动到另一个数组,保持不变量
- 反向
我真的被卡住了,在这里想不出其他任何事情。
例子:
"HHABC" -> "ABHCH";
"CBAXXXX" -> "XAXBXCX";
"AAABBBCCCCCCCDDDDD" -> "ABABACBCDCDCDCDCDC";
这里是详细的模型求解算法。我认为我不允许发布实际代码,所以它是这样的:
- 构建直方图。它可以存储在 int 数组中,索引是 ascii 代码,因此不需要映射。
- 构建新字符串:
- 每个字符按字母顺序排列,从 A 到 Z
- 如果根据直方图没有这样的符号,移到下一个
- 如果之前的书写符号相同,则移动到下一个(如果不是第一次迭代)
- 写第一个找到的合适的字符
- 减少直方图中的数字
- 如果当前符号有 (length-i+2)/2(剩下的一半),则中断此循环并转到字符串中的下一个符号。
它比我最终写的那个烂摊子更短更简单(虽然它工作得很好,非常感谢你的帮助)。
【问题讨论】:
-
您真的不需要对输入数据进行任何排序或重新排列。由于您只有 26 个可能的输入值,因此只需在 O(n) 中生成直方图,然后使用直方图 bin 计数来生成适当交错的输出序列,再次在 O(n) 中。
-
我知道我的想法过于复杂。但现在我不能完全抓住这个想法。如果用简单的话,我该怎么做第二部分?
标签: arrays algorithm time-complexity