算法打印N对合理括号组合

Posted tab_tab_tab

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法打印N对合理括号组合相关的知识,希望对你有一定的参考价值。

题目:打印N对合理括号组合,比如输入3 输出
((()))
()(())
()()()
(())()
(()())


void PrinAr(char *str,int pos,int left,int right)
//pos为写入的位置
    if(NULL == str || left < 0 || right < left) return;
    if(left == 0 && right == 0) 
    
        cout<<str<<endl;//写入完毕
        return ;
    
    if(left > 0)//插入左括号的情况
    
        str[pos] = '(';
        PrinAr(str,pos+1,left-1,right);
    

    if(right > left)//插入右括号的情况
    
        str[pos] = ')';
        PrinAr(str,pos+1,left,right-1);
    



void PrinAr(int n)

    char *str = new char[2*n+1];
    str[2*n] = '\\0';
    PrinAr(str,0,n,n);
    delete []str;

思想:无疑是分治法了,具体来说是考虑要记录的状态一共有left,right,还有写入的位置Pos
然后考虑什么时候可以插入’(‘:当left只要不为0,理论上来说是可以一直插入的。这样不算违规。
考虑什么时候不可以插入’)’:呃,肯定考虑什么时候不能插入右边吧。当发现形如())这样的就算犯规了,或者说插入的right > 插入的left,剩余的right < 剩余的left。。。。
所以反过来,当剩余的right > 剩余的left时候就可以随便插入了

以上是关于算法打印N对合理括号组合的主要内容,如果未能解决你的问题,请参考以下文章

面试题 08.09. 括号

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

括号的全部有效组合

LintCode刷题——生成括号

LeetCode 22. 括号生成(Generate Parentheses)

经典问题——输出n对括号的所有组合