[Leetcode]Generate Parentheses(生成括号)

一、题目描述

Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.

For example, given n = 3, a solution set is:

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

给定一个数字n,生成共有n组括号的所有正确形式。

leetcode中还有两道和括号相关的题目:

  • Valid Parentheses
  • Longest Valid Parentheses

二、解题思路

对于要列出所有结果的题目首先考虑使用递归法求解。要生成的字符串中只能有左括号和右括号,假设 n = 3 ,则一定有3个左括号和3个右括号。定义两个变量 left 和 right 分别表示剩余的左右括号的个数,在递归过程中如果left > right,说明此时字符串中的右括号比左括号多,这是错误的情况,直接返回。当 left 和 right 都为0时,说明此时已用完所有括号,为一个合法结果压入结果向量中。其他情况下,如果left > 0,调用递归函数并更新参数(在字符串后添加一个左括号,且left-1);如果right > 0同理。

三、具体实现

class Solution {
public:
    vector<string> generateParenthesis(int n) {
        // Write your code here
        vector<string> res;
        string out;
        dfs(n, 0, 0, out, res);
        return res;
    }
    void dfs(int n, int left, int right, string &out, vector<string> &res) {
        if (left < n) { 
            out.push_back('(');
            dfs(n, left + 1, right, out, res);
            out.pop_back();
        }
        if (right < left) {
            out.push_back(')');
            dfs(n, left, right + 1, out, res);
            out.pop_back();
        }
        if (out.size() == n * 2)
            res.push_back(out);
    }
};

四、心得体会

递归是一个使用起来很方便也比较常见的方法,如果理解明白就很好用,不明白的话就很头疼。

当需要列出所有结果的时候可以考虑一下使用递归法。

继续加油吧!!!

猜你喜欢

转载自blog.csdn.net/m0_38068229/article/details/88785570
今日推荐