回溯算法:加入去重操作
class Solution { public: void dfs(vector<string>& res, vector<bool>& used, string& path, string& str) { if (path.length() == str.length()) { res.push_back(path); return; } for (int i = 0; i < str.length(); i++) { if (used[i]) continue; if (i > 0 && str[i] == str[i - 1] && !used[i - 1]) continue; path.push_back(str[i]); used[i] = true; dfs(res, used, path, str); used[i] = false; path.pop_back(); } } vector<string> Permutation(string str) { sort(str.begin(), str.end()); vector<string> res; string path; vector<bool> used(str.length(), false); dfs(res, used, path, str); return res; } };
n!算法:全排列
class Solution { public: void dfs(unordered_set<string>& hash, string& str, int start) { if (start == str.length() - 1) { if (!hash.count(str)) hash.insert(str); return; } for (int i = start; i < str.length(); i++) { swap(str[i], str[start]); dfs(hash, str, start + 1); swap(str[i], str[start]); } } vector<string> Permutation(string str) { if (str == "") return {""}; unordered_set<string> hash; dfs(hash, str, 0); return vector<string>(hash.begin(), hash.end()); } };