• 对字符串进行排序,用于后续剔除重复排序;
  • 采用递归+回溯,当组合长度等于字符串长度时,将该组合放入结果并返回;
  • 如果本层已使用过相同原始,跳过本次组合;
  • 如果当前元素还未使用过,则将该元素放入本次组合,继续进行本次组合,返回后弹出该元素继续进行其他组合;
  • 所有情况遍历完成后,返回最终排列结果。
class Solution {
public:
    void backtracking(string& s,vector<bool>& visited, vector<string>& res, string& path) {
        if (path.size() == s.size()) {
            res.push_back(path);
            return;
        }
        for (int i = 0; i < s.size(); i++) {
            if (i > 0 && s[i] == s[i - 1] && visited[i - 1] == false) {
                continue;
            }
            if (visited[i] == false) {
                visited[i] = true;
                path.push_back(s[i]);
                backtracking(s, visited, res, path);
                path.pop_back();
                visited[i] = false;
            }
        }
    }
    vector<string> Permutation(string str) {
        vector<string> result;
        vector<bool> visited(str.size(), false);
        string path;
        sort(str.begin(), str.end());
        backtracking(str, visited, result, path);
        return result;
    }
};