题解 | #字符串的排列#
字符串的排列
https://www.nowcoder.com/practice/fe6b651b66ae47d7acce78ffdd9a96c7
回溯 + 用set去重
class Solution { public: /* 原字符串有重复字符, 比如aab aab aba baa 借用set来进行去重 */ set<string> result; vector<string> Permutation(string str) { if (str.empty()) return vector<string>(result.begin(), result.end()); sort(str.begin(), str.end()); vector<bool> state(str.size(), false); // 定义state数组, 用于表明是否被选择过 back_tracking(str, "", state); return vector<string>(result.begin(), result.end()); } void back_tracking(string& s, string cur, vector<bool>& state) { if (cur.size() == s.size()) { result.insert(cur); return; } for (int i = 0; i < s.size(); ++i) { if (state[i]) continue; state[i] = true; cur += s[i]; // 加入cur中 back_tracking(s, cur, state); // 递归 state[i] = false; // 回溯, state恢复为false cur = cur.substr(0, cur.length() - 1); // 回溯, 减掉最后一个字符 } return; } };
回溯 + 不用set去重
class Solution { public: vector<string> result; vector<string> Permutation(string str) { if (str.empty()) return result; sort(str.begin(), str.end()); vector<bool> state(str.size(), false); // 定义state数组, 用于表明是否被选择过 back_tracking(str, "", state); return result; } void back_tracking(string& s, string cur, vector<bool>& state) { if (cur.size() == s.size()) { result.push_back(cur); return; } for (int i = 0; i < s.size(); ++i) { // 1. 已经被用过 // 2. 可以用i和i-1判读,因为排序过,遇到重复且前一个被使用则可以跳过 if (state[i] || (i > 0 && s[i] == s[i-1] && state[i-1])) { continue; } state[i] = true; cur += s[i]; // 加入cur中 back_tracking(s, cur, state); // 递归 state[i] = false; // 回溯, state恢复为false cur = cur.substr(0, cur.length() - 1); // 回溯, 减掉最后一个字符 } return; } };
2023-剑指-回溯 文章被收录于专栏
2023-剑指-回溯