美文网首页
打印括号的有效组合

打印括号的有效组合

作者: chappie2017 | 来源:发表于2017-07-05 10:49 被阅读0次

题目

输入n,表示有n/2个左括号,n/2个右括号
打印出这n个括号的有效组合

解法

深度优先搜索+

#include <iostream>

void print_result(int A[], int n , int cur){
    if(A==NULL || n<1 || cur<0 || cur>=n)
        return;
    if(A[0]==0)
        std::cout<<"{"<<std::flush;
    else
        std::cout<<"}"<<std::flush;
    for(int i=1; i<cur ; ++i){
        if(A[i]==0)
            std::cout<<" {"<<std::flush;
        else
            std::cout<<" }"<<std::flush;
    }
    for(int i=cur ; i< n ; ++i)
        std::cout<<" }"<<std::flush;
    std::cout<<std::endl;
}
long long count;
void dfs(int A[], int n, int rem, int stack_ , int cur){
    if(A==NULL || n<1 ||rem<0 || stack_<0 || cur<0 || cur>n)
        return;
    if(rem==0){
        print_result(A, n, cur);
        return;
    }
    A[cur]=0;
    dfs(A, n, rem-1, stack_+1, cur+1);
    A[cur]=1;
    dfs(A, n, rem, stack_-1, cur+1);
}

void print(int n){
    if( n<0 || n%2)
        return;
    int *A=new int[n];
    dfs(A, n, n/2, 0, 0);
    delete[] A;
}

int main()
{
    int n;
    bool blanc=false;
    while(std::cin>>n){
        if(blanc)
            std::cout<<std::endl;
        if(n==0)
            break;
        count=0;
        print(n);
        blanc=true;
    }
    return 0;
}

如果不要求打印输出,只是求出有多少个组合,那么就可以使用递推公式:
f(0)=1
f(n)=f(0)f(n-2)+f(2)f(n-1)+...+f(n-2)*f(0)

long long total_(int n){
    if(n<=0 || n%2)
        return 0;
    int *A = new int[n/2+1];
    A[0]=1;
    long long total;
    for(int i=1 ; i<n/2+1 ; ++i){
        total=0;
        for(int j=0 ; j<i/2; ++j){
            total=total+2*A[j]*A[i-1-j];
        }
        if( i%2 )
            total+=A[i/2]*A[i/2];
        A[i]=total;
    }
    delete[] A;
    return total;
}

相关文章

  • 打印括号的有效组合

    题目 输入n,表示有n/2个左括号,n/2个右括号打印出这n个括号的有效组合 解法 深度优先搜索+ 如果不要求打印...

  • 回溯算法和深度优先搜索(二)

    先看一道题目: 括号生成。 输入一个整数 ,罗列出所有有效的括号组合。有效的括号组合是指 左括号开始,右括号结束,...

  • 22. 括号生成

    数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。 有效括号组合需满足...

  • 要成功就做一百题-93

    题目名称 有效的括号判断 描述 输入的字符串只包含{ [] } ()三种括号的组合,判断输入是否是有效的括号,如下...

  • 给出一个偶数,获取所有的括号组合

    现在给出一个偶数n,要求打印出所有的括号的组合,括号有两种,分别是(和)要求: 左括号右边一定得有一右括号和它对应...

  • LeetCodeDay51 —— 括号生成★★☆

    22. 括号生成 描述 给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。...

  • leetcode(python)22.括号生成

    22.括号生成 给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。 例如,...

  • 动态规划:22.括号生成

    /** 题目 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。 示例...

  • [day7] [LeetCode] [title22,3,26]

    22.括号生成 给出n代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。 例如,给出...

  • LeetCode 022

    括号生成 给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。例如,给出 n...

网友评论

      本文标题:打印括号的有效组合

      本文链接:https://www.haomeiwen.com/subject/pynfhxtx.html