输出所有括号组合

题目:有n个括号,输出所有正确的括号组合
括号组合个数:根据卡特兰数原理,总共的括号组合数是C(2n)(n)/(n+1)
分析:可以模拟左右括号进出栈的情况计算所有正确的括号组合,如果有剩余的左括号,在任何时刻都可以进栈,栈中有未匹配的左括号时(进栈的左括号数大于右括号数),右括号可以进栈。当所有括号都进栈时,便可得到一个括号组合。

 

static int pairCount = 0;
//brackets中是当前括号的匹配情况,
//bracketCount是brackets中已有的括号数目,
//leftBrackets是剩余的左括号数目,
//rightBrackets是剩余的右括号数目
//左括号可以随时放入brackets中,但是右括号只能在剩余数目大于左括号时才能放入brackets中
static void GenPairCore(char* brackets, int bracketCount, int leftBrackets, int rightBrackets){
    //没有剩余的括号,此时输出一个组合
	if(leftBrackets==0 && rightBrackets==0){
		cout<"<0){
			brackets[bracketCount] = '(';
			GenPairCore(brackets, bracketCount+1, leftBrackets-1, rightBrackets);
		}
		//剩余的右括号数大于左括号数,说明栈中有未匹配的左括号,此时左括号可进栈
		if (rightBrackets>leftBrackets){
			brackets[bracketCount] = ')';
			GenPairCore(brackets, bracketCount+1, leftBrackets, rightBrackets-1);
		}
	}
}
//输出n对括号的所有正确组合
void GenPair(int n){
	pairCount = 0;
	char* brackets = new char[(n<<1)+1];
	brackets[n<<1] = '\0';
	GenPairCore(brackets, 0, n, n);
	delete[] brackets;
}

 

你可能感兴趣的:(数据结构,括号相关)