leetcode22 括号生成

题目:https://leetcode-cn.com/problems/generate-parentheses/

给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。

样例输入与输出

n = 3
输出:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"]

思路

  • 不难想出直接暴力的做法,每个位置上有"("和")"两种选择,总共有2^n种情况。但可以进行优化,因为第一个括号一定是"(",并且只有在有"("时才能放置")",因此记录左括号的个数,每放一个右括号,左括号的数目减1,当左括号数目为0时,下一位置不能放置右括号。

代码

class Solution {
public:
    vector generateParenthesis(int n) {
        vector ans;
        string str; str.resize(2*n);
        dfs(0, n, str, ans, 0);
        return ans;
    }
private:
    void dfs(int idx, int n, string& str, vector& ans, int l){
        if(idx == 2*n){
            if(l == 0){
                ans.push_back(str);
            }
            return;
        }
        str[idx] = '('; dfs(idx+1, n, str, ans, l+1);
        if(l)
            {str[idx] = ')'; dfs(idx+1, n, str, ans, l-1); }
    }
};
  • 另一种搜索策略,参考 https://leetcode-cn.com/problems/generate-parentheses/solution/hui-su-suan-fa-by-liweiwei1419/ 左右括号的个数必定分别为n,以左右括号剩余个数作为状态,搜索策略是:1)当还有左右括号时才能产生分支 2)只要左括号个数大于0,就可以产生左分支 3)产生右分支时,只有右括号个数严格大于左括号个数时才能产生分支。

你可能感兴趣的:(leetcode22 括号生成)