华为机考题
使用深度优先搜索输出,以排列数为例类似题目整数(1~n)的排列,count1数组标记使用情况,并在进入下一层后回溯将count1数组对应位置置0,用vector动态记录产生的所有排列字符串,然后使用unique和erase去重。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int N=11;
char path[N];
char st[N];
vector<string> str;
int count1[200];
int cnt=0;
string s1[100000];
void dfs(int u,int n)
{
if(u>n)
{
string s2;
for(int i=1;i<=n;i++)
{
//cout<<path[i];
s2+=path[i];
}
str.push_back(s2);
return;
}
for(int i=0;i<n;i++)
{
if(count1[i]==0)
{
path[u]=st[i];
count1[i]++;
dfs(u+1,n);
count1[i]=0;
}
}
}
int main()
{
string s;
cin>>s;
for(int i=0;i<s.size();i++)
{
st[i]=s[i];
}
dfs(1,s.size());
sort(str.begin(),str.end());
str.erase(unique(str.begin(),str.end()),str.end());
for(auto item:str)
{
cout<<item<<endl;
}
return 0;
}