Leetcode之括號生成(C++)

今天,我們來看一下LeetCode的第22道題:括號生成

題目描述

給出 n 代表生成括號的對數,請你寫出一個函數,使其能夠生成所有可能的並且有效的括號組合。

例如,給出 n = 3,生成結果爲:

[
  "((()))",
  "(()())",
  "(())()",
  "()(())",
  "()()()"
]

思路:
首先,我們要明確題目的要求,給出n對括號,生成這n對括號的所有排列組合,要求是每一個‘(’和‘)’都要一一對應起來。
我們可以使用遞歸來實現。怎麼遞歸呢?首先定義一個string的對象s,將全部的‘(’添加到s中,然後依次給s添加‘)’,添加了多少個‘(’就要添加多少個‘)’,因爲他們要一一對應起來。當全部添加結束後就將該對象放入vector中,這裏因爲C++引用與非引用在遞歸中的特點,每次減少一個‘(’,然後在添加‘)’,逐步的添加‘(’和‘)’。如下爲前兩次所示。
每一行代表給s中尾插了一個字符。

//第一次
1、“(”
2、“((”
3、“(((”
4、“((()”
5、“((())”
6、“((()))”//到這裏結束,可以將該字符串放入vector中
//第二次
1、“(”
2、“((”
3、“((”
4、“(()(”
5、“(()()”
6、“(()())”//到這裏結束,可以將該字符串放入vector中
//其中第二次的1、2、3步和第一次的1、2、3步是一樣,只不過是返回了上層函數,字符串沒有用引用的原因,字符串又變回去了。

代碼

//res:題目給出的函數將要返回的vector的對象。
//s:該s就是上述思路中所一直在提到的s,存放“(”和“)”的排列組合的字符串。
//left:表示‘(’已經出現的個數。
//right:表示‘)’已經出現的個數。
//n:題目給出的n
    void _generateParenthesis(vector<string>& res, string s, int left, int right, int n)
    {
        if(right== n)
        {
            res.push_back(s);
            return;
        }
        if(left< n)
            _generateParenthesis(res, s + "(", left+ 1, right, n);
        if(left> right)
            _generateParenthesis(res, s + ")", left, right+ 1, n);
       }
    vector<string> generateParenthesis(int n) {
        vector<string> res;
        _generateParenthesis(res, "", 0, 0, n);
        return res;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章