题意:给定字符串(长度最大为13),字母可能有重复,要求按升序输入其所有的全排列,注意,字母的大小顺序为A<a<B<b<...<Z<z
算法:
1.dfs
2.STL
/*
算法:dfs
*/
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
char c[20]; // 存储输入的字符串
char ans[20]; // 存放结果
int cnt[100]; // 存放每个字母出现的次数
bool cmp(const char &a, const char &b)
{
if (a >= 'A' && a <= 'Z' && b >= 'A' && b <= 'Z')
{
return a < b;
}
else if (a >= 'a' && a <= 'z' && b >= 'a' && b <= 'z')
{
return a < b;
}
else if (a >= 'A' && a <= 'Z' && b >= 'a' && b <= 'z')
{
return a + 32 <= b ;
}
else if (a >= 'a' && a <= 'z' && b >= 'A' && b <= 'Z')
{
return a < b+32;
}
}
void dfs(int curr, int n)
{
if (curr == n)
{
ans[n] = '\0';
cout << ans << endl;
return;
}
for (int i=0; i<n; i++)
{
// 如果c[i]==c[i-1],为了避免重复枚举,即相同的值只枚举一次,故c[i]不再枚举
if (i == 0 || c[i] != c[i-1])
{
if (cnt[c[i]-'A'] > 0)
{
cnt[c[i]-'A']--;
ans[curr] = c[i];
dfs(curr+1,n);
cnt[c[i]-'A']++;
}
}
}
}
int main()
{
int cases;
cin >> cases;
for (int i=0; i<cases; i++)
{
cin >> c;
int len = strlen(c);
sort(c,c+len,cmp);
memset(cnt,0,sizeof(cnt));
for (int i=0; i<len; i++)
{
cnt[c[i]-'A']++;
}
dfs(0,len);
}
}
/*
算法:STL
*/
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
bool cmp(const char &a, const char &b)
{
if (a >= 'A' && a <= 'Z' && b >= 'A' && b <= 'Z')
{
return a < b;
}
else if (a >= 'a' && a <= 'z' && b >= 'a' && b <= 'z')
{
return a < b;
}
else if (a >= 'A' && a <= 'Z' && b >= 'a' && b <= 'z')
{
return a + 32 <= b ;
}
else if (a >= 'a' && a <= 'z' && b >= 'A' && b <= 'Z')
{
return a < b+32;
}
}
int main()
{
int cases;
char c[20];
cin >> cases;
for (int i=0; i<cases; i++)
{
cin >> c;
int len = strlen(c);
sort(c,c+len,cmp);
cout << c << endl;
while(next_permutation(c, c+len, cmp))
{
cout << c << endl;
}
}
}