ソードフィンガーオファー38.弦のアレンジ(バックトラック)

文字列を入力し、文字列内の文字のすべての順列を出力します。

この文字列配列は任意の順序で返すことができますが、重複する要素を含めることはできません。

例:

入力:s = "abc"
出力:["abc"、 "acb"、 "bac"、 "bca"、 "cab"、 "cba"]

分析:

問題を整理するには、指定された文字列または配列に繰り返し要素を含めることができるかどうかに注意する必要があります。この質問には、Likouの46の質問とは異なり、繰り返し要素を含めることができます。ここでは、使用済み配列を使用します。は、1つの要素の使用を回避するために使用された要素をマークするために使用されます。複数回(プルーニング)、unordered_mapの自動重複排除メカニズムを使用して、繰り返される組み合わせを除外します(たとえば、s = "aab"の場合、次のようになります。最初のaから再帰的にaab、2番目のaから再帰後のaabもあります。タイトルに繰り返し要素が含まれていない場合、この問題は発生しません)

ps:unordered_mapの実装はハッシュテーブルであり、赤黒木で実装されたマップよりも高速です。

class Solution {
    
    
public:
    vector<string> v;
    string tempS;
    unordered_set<string> ss;
    void backtracking(string& s, vector<bool>& used){
    
    
        if(tempS.size() == s.size()){
    
    
            if(ss.find(tempS) != ss.end()) return;
            else{
    
    
                ss.insert(tempS);
                v.push_back(tempS);
                return;
            }
        }
        for(int i = 0; i < s.size(); i++){
    
    
            if(used[i] == true) continue;  
            used[i] = true;
            tempS.push_back(s[i]);
            backtracking(s, used);
            tempS.pop_back();
            used[i] = false;
        }
        
    }
    vector<string> permutation(string s) {
    
    
        vector<bool> used(s.size(), false);
        backtracking(s, used);
        return v;
    }
};

ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/qq_34612223/article/details/114328227