您的位置:首页 > 其它

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

2016-04-27 22:45 615 查看
题目:打印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时候就可以随便插入了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: