【LeetCode】22. Generate Parentheses

来源:互联网 发布:网站代备案 知乎 编辑:程序博客网 时间:2024/06/05 04:16

题目描述

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:

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

解题思路

以下提供两种解题思路

  1. 直接使用回溯法遍历所有情况,然后在子节点处使用一个栈来判断括号是否完全对应。这是比较容易想到的,但是相当耗时,实测33ms
  2. 直观的解法。分别使用n和m来记录还需要加上多少个”(“和”)”。递归向下求解,当n>0时,添加”(“并给n-1以及m+1, 当m>0时,添加”)”并给m-1。当n和m都为0时,则为符合条件的情况。

AC代码

  1. 解法一(33ms)
class Solution {public:    void genPar(vector<string>& ans, string& curStr, int n) {        if (curStr.size() == n) {            stack<char> tempS;            for (int i = 0; i < n; ++i) {                if (tempS.empty())                    tempS.push(curStr[i]);                else {                    char topChar = tempS.top();                    if (topChar == '(' && curStr[i] == ')')                        tempS.pop();                    else                         tempS.push(curStr[i]);                }            }            if (tempS.empty())                ans.push_back(curStr);        }        else {            curStr.push_back('(');            genPar(ans, curStr, n);            curStr.pop_back();            curStr.push_back(')');            genPar(ans, curStr, n);            curStr.pop_back();        }    }    vector<string> generateParenthesis(int n) {        string tempStr = "";        vector<string> ans;        genPar(ans, tempStr, 2*n);        return ans;    }};
  1. 解法二(3ms)
class Solution {public:    vector<string> generateParenthesis(int n) {        vector<string> res;        addingpar(res, "", n, 0);        return res;    }    void addingpar(vector<string> &v, string str, int n, int m){        if(n==0 && m==0) {            v.push_back(str);            return;        }        if(m > 0){ addingpar(v, str+")", n, m-1); }        if(n > 0){ addingpar(v, str+"(", n-1, m+1); }    }};
0 0
原创粉丝点击