求带重复字母的全排列
两种方法
1.C++函数直接出结果
2.DFS
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cstdlib>
const int INF = 1e7;
using namespace std;
int dp[1005],v[600],p[600];
int cmp(const void *a,const void *b)
{
return *(char *)a - *(char *)b;
}
int main()
{
char a[200];
scanf("%s",a);
int len = strlen(a);
qsort(a,len,sizeof(a[0]),cmp);
puts(a);
while(next_permutation(a,a+len))
{
puts(a);
}
return 0;
}
DFS:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include<algorithm>
using namespace std;
int len;
bool vis[201];
char str[201];
char b[201];
void DFS(int n)
{
if (n==len)
{
puts(b);
return;
}
for (int i=0;i<len;i++)
{
if (vis[i]||(i>0&&vis[i-1]==0&&str[i]==str[i-1]))
continue;
b[n]=str[i];
vis[i] = 1;
DFS(n+1);
vis[i]=0;
}
}
int main()
{
while (scanf("%s", str) != EOF)
{
len = strlen(str);
memset(vis, 0, sizeof(vis));
sort(str,str+len);
DFS(0);
}
return 0;
}