zoukankan      html  css  js  c++  java
  • 括号问题 【微软面试100题 第四十六题】

    题目要求:

      四对括号可以有多少种匹配排列方式?比如两对括号可以有两种:()()和(())

    题目分析:

      之前左括号的数量必须比右括号多,即卡特兰数,

      令h(0)=1,h(1)=1,catalan数满足递推式,

      h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (n>=2),

      例如:h(2)=h(0)*h(1)+h(1)*h(0)=1*1+1*1=2,

      h(3)=h(0)*h(2)+h(1)*h(1)+h(2)*h(0)=1*2+1*1+2*1=5,

      h(n)=C(2n,n)/(n+1),
      程序实现比较巧妙,参见具体代码。
    代码实现:
      
    #include <iostream>
    using namespace std;
    
    #define N 3
    int a[N];
    
    void display()
    {
        for (int i = 1; i <= N; ++i)
        {
            cout<< '(';
            for (int j = 1; j <= a[i]; ++j)
                cout<< ')';
        }
        cout<<endl;
    }
    //有N 对括号,则 B函数主要求的是N个 ')'怎么与前面的'('搭配
    //a[i] 表示对应某个位置的 ')'个数,如:()()表示 a[1] = 1,
    //a[2] = 1;(()) 表示a[1] = 0,a[2] = 2; a[i]之和肯定等于N;
    //但是不能是())(这样的,因为这里面 a[1] = 2了。即a[i]最多有 i个')' ,最少为个。
    void B(int level, int sum, int &result)
    {
        //level表示'('的个数
        if (level == N)
        {
            a[N] = N - sum;
            ++result;
            display();
        }
        else
        {
            //i+sum<=level表示此时的')'总数要 <='('的总数,不然不满足要求。
            for (int i = 0; i+sum<= level; ++i)
            {
                a[level] = i;
                B(level + 1, sum + i, result);
                a[level] = 0;
            }
        }
    }
    
    int main()
    {
        int result = 0;
        B(1, 0, result);
        cout<<result<<endl;
        return 0;
    }
  • 相关阅读:
    MongoDb查询
    HBase学习笔记(四)—— 架构模型
    HBase学习笔记(一)——基础入门
    看完此文,妈妈还会担心你docker入不了门?
    Kafka学习笔记(四)—— API原理剖析
    集合框架学习之ArrayList源码分析
    集合类不安全之Set
    集合类不安全之ArrayList
    Java内存模型学习笔记(一)—— 基础
    An Illustrated Proof of the CAP Theorem
  • 原文地址:https://www.cnblogs.com/tractorman/p/4081506.html
Copyright © 2011-2022 走看看