题目描述:
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:
"((()))", "(()())", "(())()", "()(())", "()()()"
Hide Tags Backtracking String
分析:
题意是给定一个整数n,构造含有n对括号的所有合法匹配形式。
咋一看该题貌似不太好求解,但是结合平时我们书写括号表达式的习惯仔细分析,还是有突破口的。大多数人都会采用递归思想来分析这个题目。
平时习惯:已打印的左括号数目不会小于右括号数目。当剩余左右括号数均等于0的时候,说明已经打印完成一个合法序列;当剩余左括号数大于0,可以随意补充左括号,而不会违背规则,当剩余右括号数大于剩余左括号数时,可以添加又括号。
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:
"((()))", "(()())", "(())()", "()(())", "()()()"
Hide Tags Backtracking String
分析:
题意是给定一个整数n,构造含有n对括号的所有合法匹配形式。
咋一看该题貌似不太好求解,但是结合平时我们书写括号表达式的习惯仔细分析,还是有突破口的。大多数人都会采用递归思想来分析这个题目。
平时习惯:已打印的左括号数目不会小于右括号数目。当剩余左右括号数均等于0的时候,说明已经打印完成一个合法序列;当剩余左括号数大于0,可以随意补充左括号,而不会违背规则,当剩余右括号数大于剩余左括号数时,可以添加又括号。
于是用C++实现的递归如下:
/*0ms//*/
class Solution {
public:
void gen(int left,int right, string s,vector<string> &vec)
{
if(left == 0 && right == 0) //剩余左右括号均为0时,一个合法序列生成完成,放入结果向量中
vec.push_back(s);
if(left > 0) //有剩余左括号,直接添加到序列中
gen(left-1,right, s + '(',vec);
if(left < right && right > 0) //剩余右括号数目大于剩余左括号数目,则添加一个右括号到序列中
gen(left,right-1, s + ')', vec);
}
vector<string> generateParenthesis(int n) {
vector<string> vec;
string s;
gen(n,n, s,vec);
return vec;
}
};