一、题目描述
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);
}
};
四、心得体会
递归是一个使用起来很方便也比较常见的方法,如果理解明白就很好用,不明白的话就很头疼。
当需要列出所有结果的时候可以考虑一下使用递归法。
继续加油吧!!!