求n对括号的合法组合
2015-04-15 18:15
435 查看
一道经典的面试题,求n对括号有多少种合法的组合。
抽象为2n个位置,每个位置可以有2种取值,总共有2^2n个组合,附加约束条件是要符合括号的语法,用来剪枝。
括号语法的合法性条件:初始化左括号和右括号的剩余数量为n,在给2n个位置赋值的过程中,需要保持剩余的'('小于等于剩余的')'遍历的过程中,每个位置先尝试左括号,再尝试右括号 。
//l表示剩余的左括号数量,r表示剩余的右括号数量,第三个参数记录合法的括号组合数 void findParens(int l, int r, int& validCnt)
{
if(l > r){return;} //剩余的左括号大于了右括号,非法case
if(l ==0 ){ //剩余的左括号肯定先被减少到0,剩余全是右括号
validCnt++;
return;
}
findParens(l-1,r,validCnt); //将当前位置赋值为左括号
findParens(l, r-1,validCnt);//将当前位置赋值为右括号
}
void testGenerateParens()
{
int pair=10;
int validCnt=0;
findParens(pair,pair,validCnt);
printf("%d\n",validCnt);
}
抽象为2n个位置,每个位置可以有2种取值,总共有2^2n个组合,附加约束条件是要符合括号的语法,用来剪枝。
括号语法的合法性条件:初始化左括号和右括号的剩余数量为n,在给2n个位置赋值的过程中,需要保持剩余的'('小于等于剩余的')'遍历的过程中,每个位置先尝试左括号,再尝试右括号 。
//l表示剩余的左括号数量,r表示剩余的右括号数量,第三个参数记录合法的括号组合数 void findParens(int l, int r, int& validCnt)
{
if(l > r){return;} //剩余的左括号大于了右括号,非法case
if(l ==0 ){ //剩余的左括号肯定先被减少到0,剩余全是右括号
validCnt++;
return;
}
findParens(l-1,r,validCnt); //将当前位置赋值为左括号
findParens(l, r-1,validCnt);//将当前位置赋值为右括号
}
void testGenerateParens()
{
int pair=10;
int validCnt=0;
findParens(pair,pair,validCnt);
printf("%d\n",validCnt);
}
相关文章推荐
- N对括号的合法组合
- LeetCode 32 Longest Valid Parentheses(最长合法的括号组合)
- 打印括号的合法组合
- 打印包含n个括号的所有合法的组合
- 输出所有的合法的括号组合
- 判断括号字符串是否为合法+求n对括号的所有组合
- N对括号的合法组合
- 【卡特兰数】有N对括号,输出所有合法的组合
- 20. Valid Parentheses--合法的括号组合(使用stack)
- LeetCode 32 Longest Valid Parentheses 最大合法括号匹配长度计算 动态规划算法有待学习
- 合法括号序列判断
- 有效括号组合
- 【递归】输出给定的n对括号对的所有合法序列
- 已知一个字符串都是由左括号(和右括号)组成,判断该字符串是否是有效的括号组合。
- 【POJ 2955】【经典区间DP 递推写法】 Brackets 【合法括号匹配成功结果+2,求最大结果】
- 合法括号子段 51Nod - 1791 **
- 51nod 1791 合法括号子段
- 经典问题之合法括号序列
- N对括号所有的合法状态
- 括号所有有效组合