这里给出了两个数量相等的数字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。那应该是我操纵的字符串
答案 0 :(得分:0)
答案 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
作为一个补充说明,因为你专门处理重复的两个不同的字符,这将给你很多重复的排列。您可以选择在将排列添加到列表之前检查是否已生成排列,最后从列表中删除重复项,或者针对您的情况优化递归。