rt.
全排列:不知道的上网查。答案要按从小到大的顺序输出,要去重。
输出:
231
输入:
123
132
213
231
312
321
看着我的这个数据理解一下
我不想用 nextpermutation 或其他的函数实现,我只想用 DFS 的方式。
我试了一下,我用的是普通的枚举排列加上一个类似于桶的二维数组实现的去重。
可以看到我的去重复杂度应该是 O(cnt∗n),n 是10 的时候,cnt=3628800,这个复杂度加上枚举所有排列的复杂度完全超了。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
string s;
ll a[20],n,vis[20],b[20],cnt,ans[4680000][20];
void dfs(ll step){
if(step==n+1){
bool flagg=false;
for(int i=1;i<=cnt;i++){
bool flag=false;
for(int j=1;j<=n;j++)
if(a[j]!=ans[i][j]){
flag=true;
break;
}
if(flag==false){
flagg=true;
break;
}
}if(flagg==false){
cnt++;
for(int j=1;j<=n;j++) ans[cnt][j]=a[j];
for(int j=1;j<=n;j++) cout<<a[j];
cout<<endl;
}
}for(int i=1;i<=n;i++){
if(vis[i]==0){
a[step]=b[i];
vis[i]=1;
dfs(step+1);
vis[i]=0;
}
}
}
int main(){
cin>>s;
for(int i=0;i<s.size();i++) b[i+1]=s[i]-'0';
n=s.size();
sort(b+1,b+n+1);
dfs(1);
return 0;
}
我也想到过把去重放到 DFS 外面去实现,但是我不会二维数组按照第二维排序。
请问有什么解决的办法?