【问题】输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。

输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。

【思路】如上图所示,树状图的第一层其实质就是下一个递归子问题入口str的值,也就是0与j(0,1,2…str.length())

交换后str的值,并且每次进入递归函数时,在i  之前字母将会被固定,其后面的数进行全排列(交换元素的位置)。然后一直递归下去,从而得到最后的全排列!一般我们写递归函数如果需要动态保存数据,如vector res, 我们可以把它当作一个参数,并使用引用传递的形式来修改res这个变量!

递归的结束条件为,索引i等于了str.length()时,递归结束!

class Solution {
public:
    void process(vector<string>& res, string str, int i){
        if(i == str.length()){
            res.push_back(str);
        }
        set<char> ss;
        for(int j = i;j < str.length(); j++){
            if(ss.find(str[j]) == ss.end()){
                ss.insert(str[j]);
                swap(str[i], str[j]);
                process(res, str, i+1);
            }
        }
    }

    vector<string> Permutation(string str) {
        vector<string> res;
        if(str.length() == 0) return res;

        process(res, str, 0);
        return res;
    }
};