字符串的排列

题目:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则按字典序打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
思路:利用递归的思想分析可知:设fun(abc)为字符串abc的所有排列情况,则fun(abc)=a fun(bc)+ b fun(ac)+ c fun(ca),可以看作第一个字符依次与后面的字符进行交换位置,然后将第一个字符固定,求后面剩余字符的全排列,交换位置可以使用一个for循环来实现。递推下去可知,fun(bc)=b fun© + c fun(b),这就看出了递归的关系,确定递归三部曲:
1.递归函数的功能:求剩余字符串的排列fun(string str,int begin),begin是剩余字符的开始位置,str是待排列的字符串
2.递归终止条件:当begin到达字符串的最后一个位置,完成一次排列,保存下来,
3.递归的下一个:fun(str,begin+1);

class Solution {
public:
    vector<string> Permutation(string str) {
        vector<string> res;
        if(str.empty()){
            return res;
        }
        per_helper(str,res,0);
        sort(str.begin(),str.end());
        return res;
    }
    void per_helper(string str,vector<string> &res,int begin){
        if(begin==str.size()-1){
            if(find(res.begin(),res.end(),str)==res.end()){
                res.push_back(str);
            }
        }
        else{
            for(int i=begin;i<str.size();i++){
                swap(str[i], str[begin]);
                per_helper(str,res,begin+1);
                swap(str[i],str[begin]);
            }
        }
    }
};
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页