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:
[ "((()))", "(()())", "(())()", "()(())", "()()()"]
分析:
l表示左括号的数量,r表示右括号的数量。
原问题可以转换成求 (0,0)到(n,n) 路径。条件得满足l>=r
如果加一个左括号(0,0)->(1,0) 再加一个 右括号(1,0)->(1,1)
那么最终 能得到的合法序列就是一条从(0,0)到(n,n)的路径,我们把这条路径就录下来就可以了。
为了方便理解 上个图
如图 红线标记的路径,向上走一步添加一个左括号,向右走一步添加一个右括号。
ac代码:
class Solution { public: vector<string> generateParenthesis(int n) { vector<string>rets; dfs(rets,"",0,0,n); return rets; } void dfs(vector<string>&rets,string s,int l,int r,int n) { if(r==n) { rets.push_back(s); return; } if(l<n) dfs(rets,s+'(',l+1,r,n); if(r<l) dfs(rets,s+')',l,r+1,n); } };