算法详解
这道题用的是dfs,原先自己写过很多遍,但是这次还是出错了,出错的地方就是
我开始错的地方就是
void dfs(int start,int n){
cout<<"res:"<<res<<" "<<"start:"<<start<<endl;
if(res.size()==n){
ress.push_back(res);
return;
}
//这里,因为自己傻了,每次都从start开始,
//那么原先的元素咋都遍历不到了。
for(int i=start;i<n;i++){
if(!vis[str[i]-'a']){
// cout<<str[i]<<" "<<i<<endl;
res = res + str[i];
// cout<<"res:"<<res<<endl;
vis[str[i]-'a'] = 1;
dfs(i+1,n);
res.pop_back();
vis[str[i]-'a'] = 0;
}
}
}
改后
void dfs(int start,int n){
cout<<"res:"<<res<<" "<<"start:"<<start<<endl;
if(res.size()==n){
ress.push_back(res);
return;
}
// if(start>n-1){
// return;
// }
for(int i=0;i<n;i++){
if(!vis[str[i]-'a']){
// cout<<str[i]<<" "<<i<<endl;
res = res + str[i];
// cout<<"res:"<<res<<endl;
vis[str[i]-'a'] = 1;
dfs(i+1,n);
res.pop_back();
vis[str[i]-'a'] = 0;
}
}
}
算法题目
ac代码
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
vector<string> ress;
int vis[100];
string res;
string str;
void dfs(int start,int n){
// cout<<"res:"<<res<<" "<<"start:"<<start<<endl;
if(res.size()==n){
cout<<res<<endl;
return;
}
for(int i=0;i<n;i++){
if(!vis[str[i]-'a']){
// cout<<str[i]<<" "<<i<<endl;
res = res + str[i];
// cout<<"res:"<<res<<endl;
vis[str[i]-'a'] = 1;
dfs(start+1,n);
res.pop_back();
vis[str[i]-'a'] = 0;
}
}
}
int main(){
cin>>str;
dfs(0,str.size());
return 0;
}