个人主页:元清加油_【C++】,【C语言】,【数据结构与算法】-CSDN博客
个人专栏
力扣递归算法题
http://t.csdnimg.cn/yUl2I
【C++】
http://t.csdnimg.cn/6AbpV
数据结构与算法
http://t.csdnimg.cn/hKh2l
前言:这个专栏主要讲述递归递归、搜索与回溯算法,所以下面题目主要也是这些算法做的
我讲述题目会把讲解部分分为3个部分:
1、题目解析
2、算法原理思路讲解
3、代码实现
题目链接:括号生成
题目
数字 n
代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
输入:n = 3 输出:["((()))","(()())","(())()","()(())","()()()"]
示例 2:
输入:n = 1 输出:["()"]
提示:
1 <= n <= 8
题目的意思非常简单,给定我们一个数字 n 用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
输入:n = 3 输出:["((()))","(()())","(())()","()(())","()()()"]
我们要解决这道题目,首先要知道的是什么是有效的括号,首先有效的括号应该符合下面两点
并且由题目意思可以的到,需要填入的空为 2n,那么我们便可以设计出决策树来了。
我们可以一共选择 2n 次,将不符合有效的括号的剪枝掉。
一、画出决策树
以 n=2 为例子
决策树就是我们后面设计函数的思路
二、设计代码
(1)全局变量
int left,right,sum;
string path;
vector ret;
(2)设计递归函数
void dfs();
以上思路讲解完毕,大家可以自己做一下了
class Solution {
public:
int left,right,sum;
string path;
vector ret;
void dfs()
{
if (right == sum)
{
ret.push_back(path);
return;
}
if (left < sum)
{
path.push_back('(');
left++;
dfs();
path.pop_back();
left--;
}
if (right < left)
{
path.push_back(')');
right++;
dfs();
path.pop_back();
right--;
}
}
vector generateParenthesis(int n)
{
sum = n;
dfs();
return ret;
}
};