【剑指offer38】字符串的排列

如果没有要求字典序排序,则直接采用递归的思想,将字符串的排列看成两步,第一步,交换第一个字母和任意一个字母(包括自己,但不包括和自己相等的其他字母)固定第一个字母,固定第一个字母,然后对后面的字符串也采用这样的操作;但是这样并不一定按照字典序排序;

class Solution {
public:
    vector<string> Permutation(string str) {
        if(str.size()==0) return {};
        sort(str.begin(),str.end());
        vector<string> res;
        per(str,0,res);
        return res;
    }
    void per(string &str,int id,vector<string> &res){
        if(id>=str.size()){
            res.push_back(str);
        }else{
            for(int i=id;i<str.size();i++){
                if(i!=id && str[i]==str[id])continue;
                char tmp=str[id];
                str[id]=str[i];
                str[i]=tmp;
                per(str,id+1,res);
                tmp=str[id];
                str[id]=str[i];
                str[i]=tmp;
            }
        }
    }
};

 

posted @ 2019-09-19 02:56  Joel_Wang  阅读(137)  评论(0编辑  收藏  举报