我正努力在C ++中解决这个问题。 我有一个字符串:{A,A,B,C},我想为此打印所有可能的排列。 这将是12: AABC,AACB,ABAC,ABCA等......
我已经编写了以下代码: - 包含字母A,A,B,C的字符串。 - 一个结果字符串,我将在其中填充递归基本条件时打印每个排列 - 一个整数数组,表示每个数字的计数器值:计数器[3] = {2,1,1},这意味着在排列中可以有2个A,1个B和1C。 - 一个应该以递归方式解决问题的函数:
从初始字符串开始。从字符串的左侧到右侧检查每个字符的计数器是否大于0.如果将字符放在result [lvl]中,其中lvl是递归的深度。然后递减该角色位置的计数器。对当前元素右侧的所有元素执行此操作,然后一直向后回溯并从下一个元素开始(第二个A)。 基本情况是当所有计数器等于0时打印解决方案然后返回。
以下是代码:
#include <iostream>
using namespace std;
char theString[4] = {'A','A','B','C'};
char resultString[4]={};
int counters[3] = {2,1,1};
void printPermutation()
{
for(int i=0; i<4; i++)
{
cout << resultString[i];
}
cout << endl;
}
void solvePermutations(int *counters, int lvl)
{
if(lvl == 4)
{
printPermutation();
return;
}
for(int i=0; i<4; i++)
{
if(counters[i] == 0)
{continue;}
else
{
resultString[lvl] = theString[i];
counters[i]--;
solvePermutations(counters, lvl+1);
counters[i]++;
}
}
}
int main()
{
int *ptr;
ptr = counters;
solvePermutations(ptr, 0);
return 0;
}
当我运行代码时,我得到的是输出而不是我期望的(12种不同的排列): ACAB ACBA BAAA BAAC BACA 等等 超过12而且没有逻辑(对我来说:D)
请帮我纠正一下,告诉我算法有什么问题并帮助我理解。谢谢。
答案 0 :(得分:1)
您的算法中有一个小的逻辑错误。您使用的是counter[3]
和theString[4]
。这里的想法是每个计数器的索引应对应一个字母,并保留所用字母的数量。
使用你的循环,你正在使用i<4
。当i
在该循环中为3时,您正在尝试访问超出范围的counter[3]
。这是未定义的行为,您可以读取任何int值。
要更正此问题,您只需缩小循环即可转到最大值2(i < 3
)并将theString
更改为包含3个元素的数组{'A', 'B', 'C'}
。
char theString[3] = {'A','B','C'};
//...
for(int i=0; i<3; i++)