给定一个有序字符串(可能有重复的字符),打印出全排列
递归实现,模拟中学计算排列数的计算方法:"1122" 的排列数 = 4! / 2! / 2! = 6
1("22") ==> 1122
1("122")
1("2") ==> 1212
2("12")
2("1") ==> 1221
"1122"
1("2") ==> 2112
1("12")
2("1") ==> 2121
2("112")
2("11") ==> 2211
void print(int &count, char *p, char *c, char *v, int n)
{
if(n == 1)
{
*c = v[0];
cout << p << endl;
++count;
return;
}
char tmp[n-1];
for(int i = 0; i < n; ++i)
{
*c = v[i];
char *t = tmp;
for(int j = 0; j < n; ++j)
{
if(i != j)
{
*t++ = v[j];
}
}
print(count, p, c + 1, tmp, n - 1);
while(i < n && v[i] == v[i + 1])
{
++i; // 跳过重复的字符
}
}
}
int main() {
cout << "Hello, World!" << endl;
char v[] = "1122";
char ch[sizeof(v)] = {0};
int count = 0;
print(count, ch, ch, v, sizeof(v) - 1);
cout << "count=" << count << endl;
return 0;
}