leetcode-22-括号生成
题目描述:
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
要完成的函数:
vector<string> generateParenthesis(int n)
说明:
1、给定一个整数n,有n对括号,要用这n对括号排列成 尽可能多 且 合理 的序列,最后返回所有的序列。
序列以字符串的格式存储,所有序列存放在vector中。
2、这道题初看很熟悉,似乎又是常见的括号匹配题…但实际上是深度优先读取二叉树的题目…
我们人在做这种题时,都是想,最开始第一个符号肯定是左括号 ( ,接着可以是左括号 ( 形成 (( ,也可以是右括号 ) 形成 () ,
再接着可以是左括号 (((,也可以是右括号 (() ,也可以是左括号 ()( ……
但对于计算机来说,这种方法的实现要复制当前情况,接着再填入两种或一种可能,再复制当前情况,再填入……
相当麻烦的一种做法。
我们换个角度来想,其实我们刚刚的做法是在建树,不断地生成新的分叉,所以其实我们可以用读取树的方法来做这道题。
我们肯定是要深度优先读取的,所以采用递归是最方便的。
代码如下:(附详解)
vector<string>res;//定义最终要返回的全局变量
void digui(string res1,int left,int right)
{
if(left==0&&right==0)//最终的退出条件
{
res.push_back(res1);//把当前得到的字符串插入到res中
return;
}
if(left>0)//如果还有左括号
digui(res1+'(',left-1,right);//当前字符串加上左括号,左括号个数-1进入递归
if(right>left)//如果当前剩余右括号个数大于左括号
digui(res1+')',left,right-1);//当前字符串加上右括号,右括号个数-1进入递归
}
vector<string> generateParenthesis(int n)
{
string res1="";
int left=n,right=n;//表示当前还有n个左括号,n个右括号
digui(res1,left,right);//进入递归
return res;
}
笔者最开始的思路是人类思路,但是不适用于计算机处理。
还是得转化为树这种数据结构来存储,接着递归读取。
但我们不是真的要建树,而是采用相似的思路来处理,方式可以更加便捷。
上述代码实测0ms,beats 100.00% of cpp submissions。