字符串的排列

来源:互联网 发布:java培训机构靠谱吗 编辑:程序博客网 时间:2024/06/10 01:44

题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。

//第一种class Solution {public:    vector<string> Permutation(string str) {        vector<string> answer;        if(str.empty())            return answer;                sort(str.begin(),str.end());        do{            answer.push_back(str);        }        while(next_permutation(str.begin(),str.end()));        return answer;    }};/*其中next_permutation的原理:http://leonard1853.iteye.com/blog/1450085百度搜索:全排列。应该可以理解下面的代码了。template<class BidirectionalIterator>bool next_permutation(      BidirectionalIterator first,       BidirectionalIterator last){    if(first == last)        return false; //空序列    BidirectionalIterator i = first;    ++i;    if(i == last)        return false;  //一个元素,没有下一个序列了    i = last;    --i;    for(;;) {        BidirectionalIterator ii = i;        --i;        if(*i < *ii) {            BidirectionalIterator j = lase;            while(!(*i < *--j));            iter_swap(i, j);            reverse(ii, last);            return true;        }        if(i == first) {            reverse(first, last);  //全逆向,即为最小字典序列,如cba变为abc            return false;        }    }}*/
//第二种:用递归实现字典序法,好像还有一种字典序法不用递归来实现,不确定。class Solution {    int u[10]={0};    vector<string> a;public:    vector<string> Permutation(string str) {        string tmp;        if(str.size()==0)            return a;        Permu(str,tmp);        sort(a.begin(),a.end());        a.erase(unique(a.begin(),a.end()),a.end());        return a;    }    void Permu(string str,string tmp){        if(str.size()==tmp.size())            return a.push_back(tmp);        for(int i=0;i<str.size();++i){            if(u[i]==0){                u[i]=1;                tmp+=str[i];                Permu(str,tmp);                tmp=tmp.substr(0,tmp.size()-1);                u[i]=0;            }        }    }    /*    Permu函数也可以这么做,对if中的临时数据tmp1操作,而不是直接对tmp操作,可以不用执行删除末尾字符。    void Permu(string str,string tmp){        if(str.size()==tmp.size())            return a.push_back(tmp);        for(int i=0;i<str.size();++i){            if(u[i]==0){                string tmp1=tmp;                u[i]=1;                tmp1+=str[i];                Permu(str,tmp1);                u[i]=0;            }        }    }    */};
/*第三种方法:虽然是递归,但第二种字典序法有区别。链接:https://www.nowcoder.com/questionTerminal/fe6b651b66ae47d7acce78ffdd9a96c7来源:牛客网*/public ArrayList<String> Permutation(String str) {        ArrayList<String> res = new ArrayList<>();        if (str != null && str.length() > 0) {            PermutationHelper(str.toCharArray(), 0, res);            Collections.sort(res);        }        return res;    }    private static void PermutationHelper(char[] cs, int i, ArrayList<String> list) {        if(i == cs.length - 1) { //解空间的一个叶节点            list.add(String.valueOf(cs)); //找到一个解        } else {            for(int j = i; j < cs.length; ++j) {                if(j == i || cs[j] != cs[i]) {                    SwapUtil.swap(cs, i, j);                    PermutationHelper(cs, i + 1, list);                    SwapUtil.swap(cs, i, j); //复位                }            }        }    }
0 0