描述

输入一个长度为 n 字符串,打印出该字符串中字符的所有排列,你可以以任意顺序返回这个字符串数组。
例如输入字符串ABC,则输出由字符A,B,C所能排列出来的所有字符串ABC,ACB,BAC,BCA,CBA和CAB。

数据范围:n < 10n<10
要求:空间复杂度 O(n!)O(n!),时间复杂度 O(n!)O(n!)

输入描述:

输入一个字符串,长度不超过10,字符只包括大小写字母。

示例1

输入:
"ab"
复制
返回值:
["ab","ba"]
复制
说明:
返回["ba","ab"]也是正确的         

示例2

输入:
"aab"
复制
返回值:
["aab","aba","baa"]
复制

示例3

输入:
"abc"
复制
返回值:
["abc","acb","bac","bca","cab","cba"]
复制

示例4

输入:
""
复制
返回值:
[""]
复制

解题思路:
跟前文数字的有重复元素全排列类似,但需要特别注意,全排列去重如果使用vector的话会超时,
直接使用set结合,默认会去重,免去了vector的find过程(时间复杂度O(n))
set的插入需要使用insert
res.insert(tmp);
set转vector的方法,只关心类型
return vector<string>({res.begin(), res.end()});

class Solution {
public:
    //vector<string>res;
    set<string> res;
    string tmp;
    vector<int>visit;
    void dfs(string str) {
        if (tmp.size() == str.size() /*&& 
        find(res.begin(), res.end(), tmp) == res.end()*/) {
            res.insert(tmp);
            //cout << tmp << endl;
            return;
        }
        for (int i = 0; i < str.size(); i++) {
            if (visit[i] == 0) {
                visit[i] = 1;
                tmp += str[i];
                dfs(str);
                tmp.pop_back();
                visit[i] = 0;
            }
        }
    }
    vector<string> Permutation(string str) {
        int n = str.size();
        visit.resize(n, 0);
        dfs(str);
        return vector<string>({res.begin(), res.end()});
    }
};