Leetcode Problem22

Generate Parentheses

问题描述:给定n对括号,要求能够生成格式正确的括号的所有组合。
例如给定n=3,那么结果应该是:


[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]


这道题依旧可以用DFS来做。想象一棵二叉树,我们知道这个括号组合的第一个肯定是“(”,因此将他设为根节点,此后每个节点的左右子树分别为左括号“(”和右括号“)”,树的高度为2*n(n为括号对的数目)。如果此时用深度优先搜索去遍历这棵二叉树,会得到这包括n个左括号和n个右括号的全排列结果,但是这个结果肯定不是我们想要的,因为这个结果里面包含了许多不合格的组合,所以要求我们做剪枝。我在这里进行了一个设定,即拥有一个右括号这个字符串的“值”加一,有一个左括号这个字符串的值减一,那么很容易可以知道,格式正确的符号组合肯定不会小于0或者大于n。所以,当遍历到某一层节点上字符串的“值”小于0或者大于n,则可以判断该字符串没有希望成为格式正确的符号组合,舍去该节点及其左右子树。如果满足上述条件遍历到叶节点,符合要求的字符串的“值”必定为0(左右括号相互抵消)。

vector<string> res;

//n表示括号对的数目,i表示第几个括号,num表示目前的字符串的值 
void alpha(string str,int n,int i,int num)
{
    if(i==2*n) //叶节点
    {
        if(num==0)
            res.push_back(str);
        return;
    }
    if(num<0||num>n) return;
    alpha(str+'(',n,i+1,num+1);
    alpha(str+')',n,i+1,num-1);
} 

vector<string> generateParenthesis(int n){
    string str="(";
    alpha(str,n,1,1);
    return res;
}

beats 100.00 % of cpp submissions.

猜你喜欢

转载自blog.csdn.net/vandance/article/details/82084180