思路就是先把字符串里所有类型的字符数量记下来,在对每个位子选择一个还有数据(ct[i]!=0)的字符填进去,递归len次。
#include<iostream>
#include<string>
#pragma warning(disable:4996)
using namespace std;
char s[501];
int result, len;
int ct[26];
void swap(int a, int b)
{
char t = s[a];
s[a] = s[b];
s[b] = t;
}
void fun(int a)
{
if (a == len)
{
s[len] = '\0';
cout << s << endl;
result++;
return;
}
for (size_t i = 0; i < 26; i++)
{
if (ct[i] != 0)
{
s[a] = 'a' + i;
ct[i]--;
fun(a + 1);
ct[i]++;
}
}
}
int main()
{
while (scanf("%d",&len)!=EOF)
{
cin >> s;
result = 0;
for (size_t i = 0; i < 26; i++)
{
ct[i] = 0;
}
for (size_t i = 0; i < len; i++)
{
ct[s[i] - 'a']++;
}
fun(0);
cout << result << endl;
}
return 0;
}