<<アルゴリズムは美しい>>-(4)-深い再帰

コンテンツ

法的な括弧

すべてのサブセット


法的な括弧

 アイデア:まず、法則を見つけてから、再帰式を作成する必要があります。この質問では、絵を描くことで、Sn = {左、右、パッケージをSn-1の各要素に追加します。左と右は間違いなく繰り返されます。STL標準ライブラリのセットを使用して重複排除できます。 。

再帰

#include<iostream>
#include<set>
using namespace std;
set<string> generateParenthesis(int n) {
    set<string> s_n;
    if (n == 1)
    {
        s_n.insert("()");
        return s_n;
    }
    set<string> s_n_1 = generateParenthesis(n - 1);
    for (string eofn_1 : s_n_1)
    {
        s_n.insert("()" + eofn_1);
        s_n.insert(eofn_1 + "()");
        s_n.insert("(" + eofn_1 + ")");
    }
    return s_n;
}
int main()
{
    set<string> generateParenthesis1 = generateParenthesis(4);
    for (set<string>::iterator it = generateParenthesis1.begin(); it != generateParenthesis1.end(); it++)
     {
         cout << *it << " ";
     }
    return 0;
}

繰り返す


set<string> generateParenthesis2(int n) {
    set<string> res;
    res.insert("()");
    if (n == 1)
    {
        return res;
    }
    for (int i = 2; i <= n; i++)
    {
        set<string> res_new;
        for (string e : res)
        {
            res_new.insert(e + "()");
            res_new.insert("()" + e);
            res_new.insert("(" + e + ")");
        }
        res = res_new;
    }
    return res;
}

小さなテスト

 ブラケットの生成


すべてのサブセット

 

アイデア:

セットにn個の要素がある場合、セットのサブセットを決定するのにnステップかかります。各ステップはコレクションから要素を取得する必要があります。現時点では、現在の番号を追加するかどうかという2つの選択肢があります。サブセットの生成にはいくつかのステップが必要であり、各ステップにはいくつかの選択肢があります。これは、バックトラッキングを適用する場合の一般的な問題です。

コードのヘルパー関数には4つのパラメーターがあり、最初のパラメーターは元の配列nums、2番目のパラメーターはnums配列で現在選択されている数値のインデックスインデックス、3番目のパラメーターは現在のサブセットcur、4番目のパラメーターです。パラメータは、現在生成されているサブセットのsetretです。

現在、nums配列内の添え字インデックスの数値には2つのオプションがあります。1つ目は、参加を検討しないことです。次に、直接スキップして再帰関数を呼び出し、インデックス+1の場合を判断できます。2つ目は、結合を検討し、現在のサブセットcurに番号を追加してから、再帰関数を呼び出してインデックス+ 1の状況を判断することです。再帰関数を実行した後、追加した番号を削除して、現在のサブセットcur値は、現在の再帰関数に入った後と現在の再帰関数を実行した後も同じままです。

再帰

class Solution {
private:
    void helper(vector<int>& nums, int index, vector<vector<int>>& ret, vector<int>& cur) {
        if (index == nums.size()) {
            ret.emplace_back(cur);
            return;
        }
        // 不加入第 index 个数字
        helper(nums, index + 1, ret, cur);

        // 加入第 index 个数字
        cur.push_back(nums[index]);
        helper(nums, index + 1, ret, cur);
        cur.pop_back();
    }

public:
    vector<vector<int>> subsets(vector<int>& nums) {
        vector<vector<int>> ret;
        vector<int> cur;
        helper(nums, 0, ret, cur);
        return ret;
    }
};

おすすめ

転載: blog.csdn.net/m0_58367586/article/details/123857240