题意:
        输入一个长度为 n 字符串,打印出该字符串中字符的所有排列,你可以以任意顺序返回这个字符串数组。

方法:
递归回溯

思路:
        

根据如上图解进行递归回溯。
        首先,对字符串排序(剪枝要用到的条件);
        然后,按照图解递归回溯。
        重点:剪枝,实现字符串含有相同字符时的去重效果。
if(i>0&&s[i]==s[i-1]&&vis[i-1]==0)//剪枝
     continue;

解释:对字符串排序,如果当前字符与前一个字符相同,并且前一个字符未访问过,则跳过。


class Solution {
public:
    int vis[15]={0};//判断是否访问过
    int len;
    vector<string> res;
    vector<string> Permutation(string str) {
        len=str.size();
        sort(str.begin(),str.end());//字符串排序
        dfs(str,"");//递归回溯
        return res;
    }
    
    void dfs(string s,string x){//递归回溯
        if(x.size()==len){
            res.push_back(x);
            return;
        }
        for(int i=0;i<len;i++){
            if(i>0&&s[i]==s[i-1]&&vis[i-1]==0)//剪枝
                continue;
            if(vis[i]==0){//如果没有访问过,则访问
                vis[i]=1;
                dfs(s,x+s[i]);
                vis[i]=0;
            }
        }
    }
};


时间复杂度:
空间复杂度: