首页 > 代码库 > LeetCode:Generate Parentheses
LeetCode: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:
"((()))", "(()())", "(())()", "()(())", "()()()"
所有组合的个数其实是一个卡特兰数。
我们这样来构造一个合法的字符串:首先第一个位置肯定是“(”,对于后面位置:
1、如果前一个字符是“(”:那么我们可以在当前位置上加入“)”(字符“)”一定有剩余);如果“(”字符还有剩余,也可以在当前位置加入“(” 本文地址
2、如果前一个字符是“)”:如果当前“(”和“)”剩余的数目不同(即其那面的括号没有完全匹配),可以在当前位置上加入“)”;如果“(”字符还有剩余,也可以在当前位置加入“(”
1 class Solution { 2 public: 3 vector<string> generateParenthesis(int n) { 4 string tmpres(n<<1, ‘(‘); 5 vector<string> res; 6 helper(1, tmpres, res, n-1, n); 7 return res; 8 } 9 private: 10 void helper(int index, string &tmpres, vector<string>&res, int leftNum, int rightNum) 11 { 12 if(index >= tmpres.size()){res.push_back(tmpres); return;} 13 if(tmpres[index-1] == ‘(‘) 14 { 15 tmpres[index] = ‘)‘; 16 helper(index+1, tmpres, res, leftNum, rightNum-1); 17 if(leftNum > 0) 18 { 19 tmpres[index] = ‘(‘; 20 helper(index+1, tmpres, res, leftNum-1, rightNum); 21 } 22 } 23 else 24 { 25 if(leftNum != rightNum) 26 { 27 tmpres[index] = ‘)‘; 28 helper(index+1, tmpres, res, leftNum, rightNum-1); 29 } 30 if(leftNum > 0) 31 { 32 tmpres[index] = ‘(‘; 33 helper(index+1, tmpres, res, leftNum-1, rightNum); 34 } 35 } 36 } 37 };
其实对于某个合法的字符串,我们可以发现从合法字符串的任何一个位置看,“(”的数目 >= ")"的数目,即剩余的“(”的数目 <= 剩余的")"数目, 因此就有以下更加简洁的代码
1 class Solution { 2 public: 3 vector<string> generateParenthesis(int n) { 4 string tmpres; 5 vector<string> res; 6 helper(tmpres, res, n, n); 7 return res; 8 } 9 private: 10 void helper(string &tmpres, vector<string>&res, int leftNum, int rightNum) 11 { 12 if(leftNum > rightNum)return; 13 if(leftNum == 0 && rightNum == 0) 14 { 15 res.push_back(tmpres); 16 return; 17 } 18 if(leftNum > 0) 19 { 20 tmpres.push_back(‘(‘); 21 helper(tmpres, res, leftNum-1, rightNum); 22 tmpres.pop_back(); 23 } 24 if(rightNum > 0) 25 { 26 tmpres.push_back(‘)‘); 27 helper(tmpres, res, leftNum, rightNum-1); 28 tmpres.pop_back(); 29 } 30 } 31 };
【版权声明】转载请注明出处:http://www.cnblogs.com/TenosDoIt/p/3776583.html
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。