n 对括号的所有合法组合

简介: 前端西瓜哥

大家好,我是前端西瓜哥,今天来看一道回溯题。

求 n 对括号的所有合法组合,要求返回一个字符串数组。比如 n 为 3 时,要求返回:

[
  "((()))",
  "(()())",
  "(())()",
  "()(())",
  "()()()"
]

代码实现

思路是回溯,题目的特征也比较明显。

我们先看代码实现。

function generateParenthesis(n: number): string[] {
  const arr: string[] = [];
  r(arr, '', n, n);
  return arr;
};
// leftRem: 左括号剩余数
// rightRem: 右括号剩余数
function r(arr: string[], str: string, leftRem: number, rightRem: number) {
  // 左括号使用量超过 n
  // 以及右括号使用数超过左括号,都是不合法的。
  if (leftRem < 0 || rightRem < leftRem) return;
  if (leftRem === 0 && rightRem === 0) {
    arr.push(str);
    return;
  }
  r(arr, str + '(', leftRem - 1, rightRem);
  r(arr, str + ')', leftRem, rightRem - 1);
}

这里简单说说回溯是怎么一个原理。

回溯就好比我们遇到岔路时,选择一条路走完后,我们再可以回到当前这个岔路口,走另一条路。岔路走完后,我们又回到上一个岔路,直到所有的路都走完。

可以看出,回溯本质是穷举。

n 对括号问题同样的道理,我们将会遇到 n 个岔路口,每个岔路口,我们有两个选择,是选择左括号呢还是右括号

r(arr, str + '(', leftRem - 1, rightRem);
r(arr, str + ')', leftRem, rightRem - 1);

但我们有可能会得到不合法的组合,有两种情况:

  1. 左括号使用数量超过 n
  2. 在添加括号的过程中,使用的右括号数不能超过左括号数。如果超过了,就说明至少有一个左括号没对象,这不合法。

还有一种情况是右括号数超过 n,但它可以由上面两种情况的组合推导而出,所以就不做讨论了。

下图为 n = 2 时,回溯的过程,其中橙色叉叉代表情况 1,红色叉叉代表情况 2。

image.png


当这两种情况发生时,就代表此路不通,不需要继续递归下去了,直接 return。

if (leftRem < 0 || rightRem < leftRem) return;

此外我们还需要知道 str 字符串变成一个合法的组合的时机。

可以是 leftRem 和 rightRem 都为 0,可以是 str 长度为 n。但我们偷懒没传 n,所以就用前者吧。

if (leftRem === 0 && rightRem === 0) {
  arr.push(str);
  return;
}

结尾

求 n 对括号的所有合法组合的题目,解法为回溯。每次选择左括号或右括号进入下一个阶段,并更新对应的一些状态(剩余数减一)。

这些状态会在后续的回溯中作为判断合法与否的条件,在特定时机结束递归。

我是前端西瓜哥,欢迎关注我。

相关文章
|
机器学习/深度学习 人工智能 自然语言处理
AIGC盛行,带你轻松调用开发
本篇文章基于java和阿里云的通义千问大模型手把手带你使用AIGC开发,实现文本对话和图像分析。
659 2
overleaf 插入图片,引用图片,图标标题Fig与文章引用Figure不一致解决
overleaf 插入图片,引用图片,图标标题Fig与文章引用Figure不一致解决
9119 0
|
5月前
|
存储 人工智能 自然语言处理
LangChain RAG入门教程:构建基于私有文档的智能问答助手
本文介绍如何利用检索增强生成(RAG)技术与LangChain框架构建基于特定文档集合的AI问答系统。通过结合检索系统和生成机制,RAG能有效降低传统语言模型的知识局限与幻觉问题,提升回答准确性。文章详细展示了从环境配置、知识库构建到系统集成的全流程,并提供优化策略以改进检索与响应质量。此技术适用于专业领域信息检索与生成,为定制化AI应用奠定了基础。
1342 5
LangChain RAG入门教程:构建基于私有文档的智能问答助手
|
算法 5G 数据安全/隐私保护
大规模MIMO通信系统信道估计matlab性能仿真,对比LS,OMP,MOMP以及CoSaMP
本文介绍了大规模MIMO系统中的信道估计方法,包括最小二乘法(LS)、正交匹配追踪(OMP)、多正交匹配追踪(MOMP)和压缩感知算法CoSaMP。展示了MATLAB 2022a仿真的结果,验证了不同算法在信道估计中的表现。最小二乘法适用于非稀疏信道,而OMP、MOMP和CoSaMP更适合稀疏信道。MATLAB核心程序实现了这些算法并进行了性能对比。以下是部分
570 84
|
10月前
|
开发工具 iOS开发 开发者
「Mac畅玩鸿蒙与硬件2」鸿蒙开发环境配置篇2 - 在Mac上安装DevEco Studio
本篇将专注于如何在 Mac 上安装鸿蒙开发工具 DevEco Studio,确保开发环境能够顺利搭建。完成安装后,可以正式开始鸿蒙应用的开发工作。
662 1
「Mac畅玩鸿蒙与硬件2」鸿蒙开发环境配置篇2 - 在Mac上安装DevEco Studio
|
11月前
|
内存技术
解码AAC裸流为PCM写入文件
使用FFmpeg库将AAC裸流解码为PCM数据并写入文件的过程。
170 4
|
JSON 前端开发 API
【淘系】商品详情属性解析(属性规格详情图sku等json数据示例返回参考),淘系API接口系列
在淘宝(或天猫)平台上,商品详情属性(如属性规格、详情图、SKU等)是商家在发布商品时设置的,用于描述商品的详细信息和不同规格选项。这些信息对于消费者了解商品特性、进行购买决策至关重要。然而,直接通过前端页面获取这些信息的结构化数据(如JSON格式)并非直接暴露给普通用户或开发者,因为这涉及到平台的商业机密和数据安全。 不过,淘宝平台提供了丰富的API接口(如淘宝开放平台API),允许有资质的开发者或合作伙伴通过编程方式获取商品信息。这些API接口通常需要注册开发者账号、申请应用密钥(App Key)和秘钥(App Secret),并遵守淘宝的API使用协议。
|
API Python
Blender脚本开发
Blender脚本开发
379 1
|
11月前
|
SQL 数据库
SQL使用视图的优缺点
SQL使用视图的优缺点
354 0
|
缓存 Oracle 前端开发
学科知识图谱学习平台项目 :技术栈Java、Neo4j、MySQL等超详细教学
学科知识图谱学习平台项目 :技术栈Java、Neo4j、MySQL等超详细教学
学科知识图谱学习平台项目 :技术栈Java、Neo4j、MySQL等超详细教学

热门文章

最新文章