Generate Parentheses--LeetCode

来源:互联网 发布:elsevier是什么数据库 编辑:程序博客网 时间:2024/06/11 05:52

1.题目

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:
[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]

2.题意

给定 n 对括号, 编写一个函数来生成格式正确的括号的所有组合。

3.分析

考虑递归求解
字符串只有’(‘和’)’两种字符,而且最终结果必定是3个’(‘,3个’)’
定义变量left和right表示左右括号的剩余个数
分为3种情况
1)left>right
即出现’)(‘这样的非法串,直接返回,不继续处理
2)left和right都为0
则此时生成的字符串已有n个左括号和n个右括号
且字符串合法,则存入结果中后返回
3)以上两种情况都不满足,
若left>0,则调用递归函数,注意left-1
若right>0,也调用递归函数,注意right-1

4.代码

1)分析中的代码实现

class Solution {public:    vector<string> generateParenthesis(int n) {        vector<string> result;        generateParenthesisDFS(result, n, n, "");        return result;    }    void generateParenthesisDFS(vector<string> &result, int left, int right, string str){        if(left < 0 || right <0 || left > right)            return;        if(left == 0 && right == 0)        {            result.push_back(str);            return;        }        else        {            // if(left > 0)                generateParenthesisDFS(result, left - 1, right, str + '(');            // if(right > 0)                generateParenthesisDFS(result, left, right - 1, str + ')');        }        return;    }};

2)思路与1类似,注意不要遗漏str.size() == n * 2
第2步的判断right < left不要写错

class Solution {public:    vector<string> generateParenthesis(int n) {        vector<string> result;        string str;        generateParenthesisDFS(result, n, 0, 0, str);        return result;    }    void generateParenthesisDFS(vector<string> &result, int n, int left, int right, string &str){        if(left < n)        {            str.push_back('(');            generateParenthesisDFS(result, n, left + 1, right, str);            str.pop_back();        }        if(right < left)        {            str.push_back(')');            generateParenthesisDFS(result, n, left, right + 1, str);            str.pop_back();        }        if(str.size() == n * 2)            result.push_back(str);        return;    }};
原创粉丝点击