【转】面试题:N对括号的合法状态

原文地址:http://www.ahathinking.com/archives/186.html

给定N对括号,输出其所有的合法的组合状态,例如,N=3,所有的合法状态为:"((()))”, “(()())”, “(())()”, “()(())”, “()()()”

思路:还是深搜DFS的思路,深搜的过程关键在于记录已经用掉的左括号个数和右括号的个数,当用过的左括号个数小于右括号则非法;当二者个数和大于2N则非法;当二者个数相等且数目等于2N则为合法。

代码如下:

#include<iostream>
using namespace std;

#define PAIR 50

char str[PAIR * 2 + 1]; // 设括号对数不超过50, str记录括号组合状态

void DFS_bracket(int n, int left_used, int right_used)
{
    if(left_used == right_used && left_used + right_used == 2 * n)
    {
        printf("%s\n", str);
        return;
    }
    if(left_used < right_used || left_used + right_used >= 2 * n)
    {
        return ;
    }
    int index = left_used + right_used;
    str[index] = '(';
    DFS_bracket(n, left_used + 1, right_used);

    str[index] = ')';
    DFS_bracket(n, left_used, right_used + 1);
}

void main()
{
    int N;
    scanf("%d", &N);
    DFS_bracket(N, 0, 0);
}

 

posted @ 2013-10-02 15:44  xmuliushuo  阅读(292)  评论(0编辑  收藏  举报