https://oj.leetcode.com/problems/generate-parentheses/
输入n产生n个( ,n个 )组成的所有合法的括号组合。
现在纸上画画,找到规律:
1.每一个位置上 ( 的个数必须 >= ) 的个数
2.如果 ( 的个数是n了,则只能再画 ) 了
3.否则,既可以是 ( 又可以是 )
4.初始第一个位置是 (
5.当 string的长度是 2*n 的时候停止
使用递归调用:
class Solution { public: vector<string> generateParenthesis(int n) { vector<string> ans; if(n<=0) return ans; string ansPiece; ansPiece.append("("); subGenerateParenthesis(n,ans,ansPiece); return ans; } void subGenerateParenthesis(int &n, vector<string> &ans, string ansPiece) { if(ansPiece.size() == 2*n) { ans.push_back(ansPiece); return; } int leftNum = 0; int rightNum = 0; for(int i = 0;i<ansPiece.size();i++) { if(ansPiece[i]=='(') leftNum++; else rightNum++; } if(leftNum==n ) { ansPiece.push_back(')'); subGenerateParenthesis(n,ans,ansPiece); } else if(leftNum == rightNum) { ansPiece.push_back('('); subGenerateParenthesis(n,ans,ansPiece); } else { string ansPiece2 = ansPiece; ansPiece.push_back('('); subGenerateParenthesis(n,ans,ansPiece); ansPiece2.push_back(')'); subGenerateParenthesis(n,ans,ansPiece2); } } };