1. 题目解析
题目链接:22. 括号生成
这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。
2.算法原理
问题描述
我们需要找出所有可能的、有效的括号序列。一个有效的括号序列指的是一个仅由'('和')'组成的字符串,并且满足以下条件:
- 左括号的数量始终大于等于右括号的数量,从左到右遍历字符串时。
- 左括号的总数与右括号的总数相等。
递归策略
我们采用递归的方法来解决这个问题。递归的核心在于,在每一步,我们都有两种选择:放置一个左括号或(在条件允许的情况下)放置一个右括号。
递归函数设计
void dfs(std::string& current, int step, int left)
current
: 存储当前构建的括号序列的字符串。step
: 当前需要填入的位置(即current
字符串的长度)。left
: 当前状态的字符串中已放置的左括号数量。
递归流程
- 递归结束条件:
- 当
step
等于目标长度(即2倍的括号对数)时,检查current
是否为一个有效的括号序列。如果是,则将其加入答案列表中。
- 当
- 放置左括号:
- 如果
left
小于目标长度的一半(即剩余的位置足够放置等量的右括号),则可以在current
的第step
个位置放置一个左括号,并递归调用dfs
函数,参数更新为step+1
和left+1
。递归完成后,需要撤销这个左括号的放置,以便尝试其他可能性。
- 如果
- 放置右括号:
- 如果当前已放置的右括号数量(
step - left
)小于已放置的左括号数量left
,则可以在current
的第step
个位置放置一个右括号,并递归调用dfs
函数,参数更新为step+1
和left
(因为右括号的放置不影响左括号的数量)。同样,递归完成后需要撤销这个右括号的放置。
- 如果当前已放置的右括号数量(
决策树的演示:
3.代码编写
class Solution {int left, right, n;string path;vector<string> ret;public:vector<string> generateParenthesis(int _n) {n = _n;dfs();return ret;}void dfs() {if (right == n) {ret.push_back(path);return;}if (left < n) // 添加左括号{path.push_back('(');left++;dfs();path.pop_back();left--; // 恢复现场}if (right < left) // 添加右括号{path.push_back(')');right++;dfs();path.pop_back();right--; // 恢复现场}}
};
The Last
嗯,就是这样啦,文章到这里就结束啦,真心感谢你花时间来读。
觉得有点收获的话,不妨给我点个赞吧!
如果发现文章有啥漏洞或错误的地方,欢迎私信我或者在评论里提醒一声~