从重复的字符串

时间:2017-05-30 18:18:36

标签: python string algorithm

给定一个字符串作为字母数字字符,其中某些字符在连续的位置重复,我们必须分散重复的字符,使它们不连续。

input: aaaabbbcdd11
Output: abababacd1d1 or any other valid combination.

如果没有这样的组合,则应该没有输出。

在采访中我问过这个问题。我仍然无法解决这个算法。我不确定这是否是正确的论坛。但我很高兴知道可以用来解决这个问题的正确算法/数据结构。

我尝试创建一个哈希(map),以便我可以保留所有字符的数量。

str = "aaaabbbcdd11"
hashChrs = {}
for item in list(str):
     if item in hashChrs:
         hashChrs[item] = hashChrs[item] + 1
     else:
         hashChrs[item] = 1
print hashChrs

{'a':4,'1':2,'c':1,'b':3,'d':2}

当最高频率字符数超过总字符数的一半时,则不会生成任何输出。

现在我无法使用地图

打印所有需要的输出

1 个答案:

答案 0 :(得分:3)

当且仅当没有出现超过天花板(字符串/ 2的长度)次的字符时,它可以被分散。你能不明白为什么如果一个角色发生的话多于那个分散角色是不可能的? (以下答案。)

  

我们可以拟合的字符的最大数量是通过交替拟合它们获得的,即“abababa”给出字母“a”的最大实例数,它可以容纳7个字符,4;这个数字可以使用公式上限(字符串长度/ 2)计算出来。

现在,算法如下:按字符串出现的频率对字符进行排序(因此“abcdabcaba”将成为“aaaabbbccd”),然后使用反向rail fence cipher with 2 rails;也就是说,将排序的字符串分成两半(如果它具有均匀的长度,将其精确地分成两半;如果不是,将其拆分使得前半部分还有一个字符)然后构建最终的字符串,交替采取每个字符串中的字符,从第一个开始。因此,“aaaabbbccd”将成为“ababacacbd”。我会留给你证明这是有效的。

  

为此,您可能希望考虑反向栅栏下不同大小的字符块会发生什么。