计算和迭代序列的排列

时间:2012-06-24 12:41:51

标签: algorithm recursion permutation

我有一个字符串和一些空格,例如字符串是“accttgagattcagt”,我有10个空格要插入。

如何迭代该字符串和空格的所有组合?字符串中的字母不能重新排序,必须插入所有空格。

如何计算重新排列的数量(不重复它们)?

这是什么意思?排列,组合或其他什么?

(我把它想象成1s和0s的字符串,其中1s被字符串使用,而0是空格。

因此,一个包含3个字母和2个空格的短字符串将要求所有5个数字,其中包括3个1和2个0,例如11100,11010,11001,10110,10101,10011,01110,01101,01011,00111?

但是很简单,因为短序列要在纸上制作,我正在努力制作一个for循环来实现它:(。很好的伪代码来创建这个序列,并计算它会有多长,拜托?

递归会更容易理解但如果以某种方式避免递归会更快吗?)

3 个答案:

答案 0 :(得分:1)

嗯,有点伪代码,但你应该明白

list doThat(string, spaces){
    returnList
    spacesTemp = spaces;
    for(c = 0; c < string.length; c++){
        subString = string.getSubString(c, string.length);
        tmpString = string.insertStringAtPosition(c, createSpaceString(spacesTemp);
        retSubStringList = doThat(subString, spaces - spacesTemp);
        retCombinedList = addStringInFrontOfAllStringsInList(tmpString, retSubStringList);
        returnList.addList(retCombinedList);
        spacesTemp--;
    }
    return returnList;
}

答案 1 :(得分:1)

那是组合。

  

因此,一个包含3个字母和2个空格的短字符串将要求所有5个数字,其中包括3个1和2个0,例如11100,11010,11001,10110,10101,10011,01110,01101,01011,00111?

你把三个'1'放在5个指数中的一个上,顺序无关紧要。所以5比3:

5!/((5-3)!3!)= 5 * 4 /(2 * 1)= 10

wikipedia.org上的文章有一个图像,说明了3个红色和2个白色方块的随机序列。

这可能有用: Statistics: combinations in Python

答案 2 :(得分:1)

n - 字母数 m - 空格数

计数

将第一个和第二个字母之间的空格数表示为a_1,将第二个和第二个字母之间的空格数表示为a_2,依此类推。您的问题现在可以表述为:在多少种不同的方式中,a_1,a_2 ..a_n-1可以选择每个数字不小于0且它们的总和满足a_1 + a_2 .... + a_(n-1) = m?这个问题的答案是n + m(通过我的意思是牛顿符号)。

为什么会这样?将此问题可视化为连续的n + m个空箱。如果我们用沙子填充其中的n个,填充之间的距离将满足我们对a_1 ... a_n-1之和的要求。

def generate(s, num_spaces):
  ans = generate_aux("_" + s, num_spaces)
  return [x[1:] for x in ans]


def generate_aux(s, num_spaces) : # returns list of arrangements
  if num_spaces == 0:
    return [s]
  if s == "":
    return []
  val = []
  for i in range(0, num_spaces + 1):
    tmp = generate_aux(s[1:], num_spaces - i)
    pref = s[0] + (" " * i)
    val.extend([pref + x for x in tmp])
  return val

print generate("abc", 2)