class Solution {
public:
vector<string>res;
void print(string s,string a,int l){
if(a.size()==l){
//if(res.empty())res.push_back(a);
/*for(int i=0;i<res.size();i++){
if(a==res[i])return;
}*/
res.push_back(a);
return;
}
for(int i=0;i<s.size();i++){
a.append(s.substr(i,1));
string temp=s.substr(i,1);
s.erase(i,1);
print(s,a,l);
s.insert(i,temp);
}
}
vector<string> permutation(string s) {
string a;
int l=s.size();
print(s,a,l);
return res;
}
};
然后在群友帮助下发现a没回溯。。
修改了一下
class Solution {
public:
vector<string>res;
void print(string &s,string &a,int l){
if(a.size()==l){
if(res.empty())res.push_back(a);
for(int i=0;i<res.size();i++){
if(a==res[i])return;
}
res.push_back(a);
return;
}
for(int i=0;i<s.size();i++){
int k=a.size();
a.append(s.substr(i,1));
string temp=s.substr(i,1);
s.erase(i,1);
print(s,a,l);
s.insert(i,temp);
a.erase(k,1);
}
}
vector<string> permutation(string s) {
string a;
int l=s.size();
print(s,a,l);
return res;
}
};
但是。。
我这个算n!n!的复杂度吗,不然没法解释超时。。毕竟官方也就nn!的复杂度。。
最后还是老老实实剪枝加一个visited字符串来搞。
class Solution {
public:
vector<string>res;
void print(string &s,string &a,int l,string visited){
if(a.size()==l){
res.push_back(a);
return;
}
visited.clear();
for(int i=0;i<s.size();i++){
int k=a.size();
string temp=s.substr(i,1);
if(visited.find(temp)!=-1)continue;
visited.append(temp);
a.append(temp);
s.erase(i,1);
print(s,a,l,visited);
s.insert(i,temp);
a.erase(k,1);
}
}
vector<string> permutation(string s) {
string a;
string visited;
int l=s.size();
print(s,a,l,visited);
return res;
}
};