Solution1:
2018年9月2日重做
典型的DFS套路,LeetCode 46 && 47
【46】https://blog.csdn.net/Allenlzcoder/article/details/80271771
【47】https://blog.csdn.net/Allenlzcoder/article/details/80275707,
重写一下:
class Solution {
public:
vector<string> Permutation(string str) {
if (!str.size()) return {};
if (str.size() == 1) return vector<string> {str};
set<string> tmp_res;
//未访问过 0; 访问过 1
vector<int> visited(str.size(), 0);
int level = 0;
string tmp_str;
my_dfs(str, tmp_res, tmp_str, visited, level);
return vector<string> (tmp_res.begin(), tmp_res.end());
}
void my_dfs(string &str, set<string> &tmp_res,
string &tmp_str, vector<int> &visited, int level) {
if (level == str.size()) {
tmp_res.insert(tmp_str);
return;
} else {
for (int i = 0; i < str.size(); i++) {
if (visited[i]) continue;
else {
tmp_str += str[i];
visited[i] = 1;
my_dfs(str, tmp_res, tmp_str, visited, level + 1);
tmp_str.pop_back();
visited[i] = 0;
}
}
}
}
};
Soltion2:
第一次做题时的答案
发现了一个代码风格很清新的博客,网址是:http://www.cnblogs.com/qqky/
此题答案就是根据此博客整理而来~
class Solution {
public:
vector<string> Permutation(string str) {
vector<string> res;
if(str.empty())
return res;
FindAll(str, 0, res);
sort(res.begin(),res.end());
return res;
}
void FindAll(string s, int begin, vector<string> &result){ //遍历第begin位的所有可能
//一次遍历的结束条件
if(begin == s.size()-1)
result.push_back(s);
for(int i = begin; iif(i!=begin && s[i] == s[begin])
continue;//有与begin位重复的字符串不进行交换,跳过
swap(s[i],s[begin]);
//当i==begin时,也要遍历其后面的所有字符
//当i!=begin时,先交换,使第begin位取到不同的可能字符,再遍历后面的字符
FindAll(s,begin+1,result);
swap(s[i],s[begin]);//为了防止重复的情况,还需要将begin处的元素重新换回来
}
return;
}
};