生成两个相等数字的所有排列

时间:2013-08-01 13:55:43

标签: permutation backtracking

这里给出了两个数量相等的数字1和0。现在我试图找到它的可能的permutaions。像这样假设我给了2 1和2 0。我开始形成这个0011.比我向前移动第一个1生成0101然后1001.现在我移动第二个1生成1010和1100.这种方法是否有效。我缺少0110,我不知道如何做到这一点。我想有一种像递归回溯这样的方法。但我不知道技术回溯。我确实理解递归。所以有人能告诉我这个方法吗?迭代或递归。如果可能的话。 我试图找到所有可能的permutaions。对于2 1和0,它是1001,1100,1010,0101,0110,0011。这就是4!/(2!* 2!)排列。我如何做更多,如111000或11110000?语言将是C ++。为了澄清它可以是任何字符,如ooii或kkjj。那应该是我操纵的字符串

2 个答案:

答案 0 :(得分:0)

用您喜欢的语言阅读排序算法。这里有一些排序类型的描述:

https://en.wikipedia.org/wiki/Sorting_algorithm

OR

我不知道你在说什么。

答案 1 :(得分:0)

这听起来像是一个家庭作业问题(如果我错了,请纠正我),所以我只是提供一些伪代码来说明一般方法。您必须弄清楚如何使算法适应C ++(并希望在此过程中理解它)。

这个想法是采用每个角色并递归地将其附加到剩余角色的每​​个排列上。基本情况是空字符串。

function foo (List<char> chars)
    List<string> permutations = new List<string>()
    for i:0..chars.length - 1
        List<string> subPermutations = foo(chars.removeAt(i))
        for each string perm in subPermutations
            permutations.add(chars.get(i) + perm)
        end for
    end for
    if permutations is empty
        permutations.add("")
    end if
    return permutations
end foo

作为一个补充说明,因为你专门处理重复的两个不同的字符,这将给你很多重复的排列。您可以选择在将排列添加到列表之前检查是否已生成排列,最后从列表中删除重复项,或者针对您的情况优化递归。