【剣指offer】文字列の並び(遡及)

7727 ワード

タイトルの説明
文字列を入力し、その文字列のすべての配列を辞書順に印刷します.例えば文字列abcを入力すると、文字a,b,cで並べられるすべての文字列abc,acb,bac,bca,cab,cbaが印刷される.
説明の入力:9を超えない文字列を入力します(文字が重複する可能性があります)、文字には大文字と小文字のみが含まれます.
構想abcを例にとると、(1)文字列を2つの部分、ヘッダ要素、および残りの要素に分ける.(2)最初の要素を他の要素と絶えず交換する.(3)残りの要素からなる文字列内を再帰的に全配列する.(4)最後の要素に交換するまで、現在の配列を出力する.
注意:(1)重複要素はスキップする必要があります.そうしないと、重複配列が出力されます(2)サブ列の全配列が得られた後、交換された要素を復元する必要があります.
コード#コード#
class Solution {
public:
    vector<string> Permutation(string str) {
        if (str.empty())
            return vector<string>();
        if (str.size()==1)
            return vector<string> {str};

        vector<string> res;
        PermutationCore(str,0,res);

        //       
        sort(res.begin(),res.end());
        return res;

    }

    void PermutationCore(string str ,int begin, vector<string> &res) {
        if (begin >= str.size()){
            res.push_back(str);
            return;
        }

        for (int i = begin; i < str.size(); ++i) {
            //         ;  
            if (str[begin] == str[i] && begin!=i){
                continue;
            }

            //            
            char tmp = str[begin];
            str[begin] = str[i];
            str[i] = tmp;

            PermutationCore(str,begin+1,res);

            //      
            tmp = str[begin];
            str[begin] = str[i];
            str[i] = tmp;
        }
    }
};