力扣22-括号生成

发布时间:2026/11/2 12:44:11

力扣22-括号生成 22. 括号生成 - 力扣LeetCode数字n代表生成括号的对数请你设计一个函数用于能够生成所有可能的并且有效的括号组合。示例 1输入n 3输出[((())),(()()),(())(),()(()),()()()]示例 2输入n 1输出[()]提示1 n 8本质在 0, 1, 2, ... , 2n - 1 中选择 n 个位置填入左括号其余 n 个位置填入右括号。需要注意的是对于这个字符串的任意前缀右括号的个数必须不大于左括号的个数因为左括号多了后面还可以补右括号前面的右括号多了后面补左括号也无法构成一对括号所以对于单个位置来说问题就变成 选或不选 即选左括号还是选右括号。如果当前左右括号数量相等那么就必须填左括号如果右括号个数小于左括号个数那么填右括号。由于一开始左右括号数量均为 0按照这个策略第一个位置填入的必然是左括号显然后续不可能出现右括号数量比左括号多的情况这是合理的class Solution: def generateParenthesis(self, n: int) - List[str]: ans [] path [] * (n * 2) # n 个左括号n个右括号 # left:左括号数量right:右括号数量 def dfs(left: int, right:int) - None: if right n: # 2n 个括号全部填完 ans.append(.join(path)) return if left n: # 左括号数量没有达到 n可以填 path[left right] ( dfs(left 1, right) if right left: path[left right] ) dfs(left, right 1) dfs(0, 0) return ans这里不需要做恢复现场因为是直接覆盖 left right 位置的元素的pythonfrom typing import List def generateParenthesis(n: int) - List[str]: ans [] path [] * (n * 2) # left: 左括号数量right: 右括号数量 def dfs(left: int, right: int) - None: if right n: # 填充完毕 ans.append(.join(path)) return if left n: # 可以填充左括号 path[left right] ( # 直接覆盖因此如果填充完毕path 不需要清空 dfs(left 1, right) if right left: # 可以填充右括号 path[left right] ) dfs(left, right 1) dfs(0, 0) return ans def main(): with open(input.txt, r) as f: nums f.read().split() # 遍历 input.txt 中的 n for num in nums: n int(num) result generateParenthesis(n) # 输出结果 print(fn {n}) print(result) print() if __name__ __main__: main()Javaimport java.io.BufferedReader; import java.io.FileReader; import java.util.ArrayList; import java.util.List; public class main { static int n; static ListString ans; static char[] path; public static ListString generateParenthesis(int n) { main.n n; ans new ArrayList(); path new char[n * 2]; dfs(0, 0); return ans; } public static void dfs(int left, int right) { if(right n) { // 填充完毕 ans.add(new String(path)); return; } if(left n) { path[left right] (; dfs(left 1, right); } if(right left) { path[left right] ); dfs(left, right 1); } } public static void main(String[] args) throws Exception { BufferedReader br new BufferedReader(new FileReader(input.txt)); StringBuilder sb new StringBuilder(); String line; while((line br.readLine()) ! null) { if(line.isEmpty()) { continue; } int n Integer.parseInt(line.trim()); ListString result generateParenthesis(n); sb.append(n ).append(n).append(\n); sb.append(result).append(\n\n); } System.out.println(sb); } }Gopackage main import ( fmt os strconv strings ) var ans []string var path []byte func dfs(n int, left int, right int) { if right n { ans append(ans, string(path)) return } if left n { path[leftright] ( dfs(n, left1, right) } if right left { path[leftright] ) dfs(n, left, right1) } } func generateParenthesis(n int) []string { ans nil path make([]byte, n*2) dfs(n, 0, 0) return ans } func main() { data, _ : os.ReadFile(input.txt) nums : strings.Fields(string(data)) for _, s : range nums { n, _ : strconv.Atoi(s) result : generateParenthesis(n) fmt.Printf(n %d\n, n) fmt.Println(result) fmt.Println() } }C#includeiostream #includevector #includestring #includefstream using namespace std; vectorstringans; string path; void dfs(int n, int left, int right) { if(right n) { ans.emplace_back(path); return; } if(left n) { path[left right] (; dfs(n, left 1, right); } if(right left) { path[left right] ); dfs(n, left, right 1); } } vectorstring generateParenthesis(int n) { ans.clear(); path string(n * 2, ); dfs(n, 0, 0); return ans; } int main() { ifstream ifs(input.txt); int n; while(ifs n) { auto result generateParenthesis(n); cout n n endl; cout [; for(int i 0; i result.size(); i) { cout result[i]; if(i ! result.size() - 1) { cout ,; } } cout ] endl endl; } return 0; }TypeScriptimport * as fs from fs; function generateParenthesis(n: number) :string[] { let ans:string[] []; let path:string[] new Array(n * 2); function dfs(left: number, right: number) { if(right n) { ans.push(path.join()); return; } if(left n) { path[left right] (; dfs(left 1, right); } if(right left) { path[left right] ); dfs(left, right 1); } } dfs(0, 0); return ans; } function main() { const data fs.readFileSync( input.txt, utf-8 ); const nums data.trim().split(/\s/); for(const s of nums) { const n Number(s); const result generateParenthesis(n); console.log(n ${n}); console.log(result); console.log(); } } main();
延伸阅读

更多相关文章

2026/11/2 13:38:31

数据资产盘点:用资源血缘让BI从‘黑盒‘变成‘透明工厂‘

导语 在与客户交流BI选型时,常常被问到的一个高频问题不再是"图表好不好看"“性能够不够快”,而是——“这个平台能不能让我说清楚,每一个指标是怎么来的、动一下会影响谁?” 这个问题的出现,标志着企业选型…

2026/10/30 5:35:33

Gopeed:现代下载管理的革命,从单一工具到全平台生态

Gopeed:现代下载管理的革命,从单一工具到全平台生态 【免费下载链接】gopeed A fast, modern download manager for HTTP, BitTorrent, Magnet, and ed2k. Cross-platform, built with Golang and Flutter. 项目地址: https://gitcode.com/GitHub_Tre…

2026/10/31 10:44:24

从零构建语音控制小车:离线识别方案与嵌入式系统实践

1. 项目概述:从“遥控”到“对话”的跨越玩过遥控车的朋友都知道,无论是红外遥控还是2.4G无线遥控,手里都得捏着个遥控器,眼睛还得时刻盯着车,生怕它撞墙。这个“语音控制小车”项目,就是把这种交互方式彻底…

2026/11/2 13:37:03

三维数字孪生与多源感知融合的智能仓储解决方案

1. 项目背景与核心需求 在大型仓储管理领域,军储库区作为特殊场景具有三个典型特征:空间结构复杂(多层货架、立体存储)、作业设备多样(叉车/AGV/人工协同)、安全要求严苛(防碰撞/防误操作&#…

2026/11/2 13:37:03

AI资讯日报制作全流程:从信息源筛选到成稿的实操指南

1. 一份AI日报的诞生:从信息洪流到可读清单每天早上七点,我习惯先花二十分钟把过去二十四小时里散落在各个角落的AI动态过一遍。这个动作坚持了快两年,最初只是个人习惯,后来慢慢变成团队里几个人会主动来问“今天有什么值得看的”…

2026/11/2 13:37:03

化工仓储区三维智能安全监控系统设计与实践

1. 项目概述:化工仓储区的安全管控挑战 化工仓储区作为高危作业场所,其安全管理一直是工业领域的重点难点。传统监控手段主要依赖固定摄像头和人工巡查,存在视觉盲区多、响应滞后等痛点。我们团队在某大型石化基地实施的这套协同管控系统&…

2026/11/2 13:37:03

从零手写MCP Server:用AI自然语言操控Excel实战

1. 为什么我要自己动手写一个 MCP1.1 从一次崩溃的 Excel 批量处理说起上个月帮朋友处理一批销售数据,二十多个 Excel 文件,每个文件里都有七八张表,需要按区域拆分、按月份汇总、再把结果回写到新的工作簿里。我一开始用的是最笨的办法——打…

2026/11/2 13:37:03

VC6.0 PNG透明处理:GDI+预乘Alpha与AlphaBlend绘制

简介:这份示例源码面向仍在维护 VC6.0 老项目的开发者,聚焦旧环境缺少原生 PNG 支持时,如何借助 GDI 完成图片加载、显示与 Alpha 透明度控制。压缩包共 70 个文件,约 4.73MB,以 34 个头文件、8 张 PNG 素材、3 个 cpp…

2026/11/2 13:32:01

医院绩效评估系统设计与实现:微服务架构与动态权重模型

1. 项目背景与选题意义医院绩效评估系统是医疗机构管理现代化的重要工具。随着医疗改革的深入推进,传统的粗放式管理模式已无法满足现代医院精细化运营的需求。我选择这个课题源于在三甲医院信息科实习时的亲身经历——每月末财务科、人事科、医务处需要耗费大量人力…

2026/11/2 6:08:01

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/2 6:39:12

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 1:04:04

工业级SPI隔离设计:硬件抗扰与信号完整性实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 1:04:04

PLFM_RADAR:主动探测数据通道,构建低误报的数据感知系统

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 1:04:04

工业SPI隔离设计:MAX14431与STM32F746硬件抗干扰实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 6:08:01

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/2 6:39:12

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑