首页/新闻资讯/正文详情

LeetCode 1096.花括号展开 II:一个一百行的解题方法(DFS)

发布时间:2026/9/27 7:57:27 来源:云帆数科 栏目:资讯中心
LeetCode 1096.花括号展开 II:一个一百行的解题方法(DFS)
【LetMeFly】1096.花括号展开 II一个一百行的解题方法DFS力扣题目链接https://leetcode.cn/problems/brace-expansion-ii/如果你熟悉 Shell 编程那么一定了解过花括号展开它可以用来生成任意字符串。花括号展开的表达式可以看作一个由花括号、逗号和小写英文字母组成的字符串定义下面几条语法规则如果只给出单一的元素x那么表达式表示的字符串就只有x。R(x) {x}ul li例如表达式 codea/code 表示字符串 codea/code。/li li而表达式 codew/code 就表示字符串 codew/code。/li /ul /li li当两个或多个表达式并列以逗号分隔我们取这些表达式中元素的并集。codeR({e_1,e_2,...}) R(e_1)nbsp;∪ R(e_2)nbsp;∪ .../code ul li例如表达式 code{a,b,c}/code 表示字符串nbsp;codea,b,c/code。/li li而表达式 code{{a,b},{b,c}}/code 也可以表示字符串nbsp;codea,b,c/code。/li /ul /li li要是两个或多个表达式相接中间没有隔开时我们从这些表达式中各取一个元素依次连接形成字符串。codeR(e_1 e_2) {a b for (a, b) innbsp;R(e_1)nbsp;× R(e_2)}/code ul li例如表达式 code{a,b}{c,d}/code 表示字符串nbsp;codeac,ad,bc,bd/code。/li /ul /li li表达式之间允许嵌套单一元素与表达式的连接也是允许的。 ul li例如表达式 codea{b,c,d}/code 表示字符串nbsp;codeab,ac,ad​​​​​​/code。/li li例如表达式 codea{b,c}{d,e}f{g,h}/code 可以表示字符串nbsp;codeabdfg, abdfh, abefg, abefh, acdfg, acdfh, acefg, acefh/code。/li /ul /li给出表示基于给定语法规则的表达式expression返回它所表示的所有字符串组成的有序列表。假如你希望以「集合」的概念了解此题也可以通过点击 “显示英文描述” 获取详情。示例 1输入expression {a,b}{c,{d,e}}输出[ac,ad,ae,bc,bd,be]示例 2输入expression {{a,z},a{b,c},{ab,z}}输出[a,ab,ac,z]解释输出中不应出现重复的组合结果。提示1 expression.length 60expression[i]由{},或小写英文字母组成给出的表达式expression用以表示一组基于题目描述中语法构造的字符串解题方法深度优先搜索解题思路这种题最容易想到的就是递归。怎么递归如果最外层是加法运算如A,B,C则返回dfs(A) dfs(B) dfs(C)。例如{a,b},cdfs({a,b}) dfs(c)a,b,cdfs(a) dfs(b) dfs(c)a,{b,c}dfs(a) dfs({b,c}){a,b{c}},{d,ef}dfs({a,b{c}}) dfs({d,ef})仅限于最外层是加法的运算。否则说明可能有两种情况要么最外层是乘法运算要么就只有一个“运算单元”如果最外层是乘法运算如ABC则返回dfs(A) * dfs(B) * dfs(C)。例如{a,b}{c,d}dfs({a,b}) * dfs({c,d})a{b,c}dfs(a) * dfs({b,c}){a,b}cdfs({a,b}) * dfs(c){a}bdfs({a}) * dfs(b){a}dfs({a})。注意这种被大括号包括的特殊情况否则说明只有一个单一的“运算单元”。如果字符串第一个字符是{则再次递归大括号中间的字符串否则说明该字符串是不含{也不含,的单一字符串直接返回该字符串。例如{a}dfs(a){a,bc}dfs(a,bc)aa。不再递归abab。不再递归以上。其实相当于递归终止条件是不含{也不含,的单一字符串。解题细节怎么判断最外层是否是加法运算使用一个变量layer记录当前的括号层数初始值是0。遇到{则layer遇到}则layer--。当遇到,时如果此时layer0说明这个,是最外层的加法运算符视为最外层为加法运算。同时我们也可以返回所有最外层,的下标。怎么判断最外层是否是乘法运算如果前面判断是否是加法运算时候返回了一个空数组说明没有最外层的逗号才会执行该判断最外层是否是乘法运算的算法。同样使用一个变量layer记录当前的括号层数初始值是0。遇到{则layer遇到}则layer--。当遇到一个字符时如果此时layer0并且该字符的前一个字符是}或者该字符是{说明不只有一个“运算单元”视为最外层为乘法运算。同时我们也可以返回所有除了起始下标0外的最外层“运算单元”起始位置的下标例如{a,b}{c,d}e相当于三个运算单元{a,b}、{c,d}和e相乘返回下标[5, 10]。如果返回下标为空数组说明只有一个“运算单元”依据第一个字符是否为{来决定是否需要继续递归否则说明该字符串总体上是不只一个运算单元的相乘递归每个运算单元并相乘。时空复杂度(我不会算)时间复杂度O ( u n k n o w n ) O(unknown)O(unknown)空间复杂度O ( u n k n o w n ) O(unknown)O(unknown)AC代码C/* * LastEditTime: 2026-09-26 11:31:38 */// struct Res : unordered_setstring {// Res() : unordered_setstring{} {}// };typedefunordered_setstringRes;Resoperator*(constResa,constResb){Res res;for(conststrings1:a){for(conststrings2:b){res.insert(s1s2);}}returnres;}Resoperator(Resa,constResb){a.insert(b.begin(),b.end());returna;}typedefvectorintIdx;classSolution{private:// 最外层是加法运算IdxgetAdd(string_view s){Idx idxs;intlayer0;for(inti0,ns.size();in;i){if(s[i]{){layer;}elseif(s[i]}){layer--;}elseif(s[i],!layer){idxs.push_back(i);}}returnidxs;}IdxgetMul(string_view s){Idx idxs;intlayer0;for(inti0,ns.size();in;i){if(!layeri(s[i-1]}||s[i]{)){idxs.push_back(i);}if(s[i]{){layer;}elseif(s[i]}){layer--;}}returnidxs;}Resdfs(string_view s){Res res;Idx idxsgetAdd(s);if(idxs.size()){// 最外层是加法运算idxs.push_back(s.size());intlast_idx-1;for(intidx:idxs){resdfs(s.substr(last_idx1,idx-last_idx-1));last_idxidx;}returnres;}// 最外层是乘法运算(或单个字符串)idxsgetMul(s);if(idxs.empty()s.size()s[0]!{){// 没有括号那就是单个字符串res.insert(string(s));returnres;}if(idxs.empty()){// 只有最外层一个大括号如 {a,b}returndfs(s.substr(1,s.size()-2));}idxs.push_back(s.size());intlast_idx0;res.insert();for(intidx:idxs){resres*dfs(s.substr(last_idx,idx-last_idx));last_idxidx;}returnres;}public:vectorstringbraceExpansionII(string expression){Res resdfs(expression);vectorstringans(res.begin(),res.end());sort(ans.begin(),ans.end());returnans;}};/* c{a{b}}d {{a,z},a{b,c},{ab,z}} {ab,c}{d},{e} a{b,c} {a,b}c {a}b {a} d,a{b,c} */#ifdef_DEBUGintmain(){string s;while(cins){Solution sol;debug(sol.braceExpansionII(s));}return0;}#endif同步发文于CSDN和我的个人博客原创不易转载经作者同意后请附上原文链接哦~千篇源码题解已开源

相关推荐

Amethyst 瓦片地图实战:从 Tile 特征实现到 TileMap 组件创建完整指南
Amethyst 瓦片地图实战:从 Tile 特征实现到 TileMap 组件创建完整指南

【免费下载链接】amethyst Data-oriented and data-driven game engine written in Rust 项目地址: https://gitcode.com/gh_mirrors/ame/amethyst 点击查看 免费下载 本篇技术指南围绕 Amethyst 游戏引擎(Rust 编写的数据驱动游戏引擎)的 a… · 2026/9/27 7:57:21

AutoBangumi 解析器配置指南:RSS 标题解析引擎、语言与全局过滤规则
AutoBangumi 解析器配置指南:RSS 标题解析引擎、语言与全局过滤规则

后端前端音视频 【免费下载链接】Auto_Bangumi AutoBangumi - 全自动追番工具 项目地址: https://gitcode.com/gh_mirrors/au/Auto_Bangumi 点击查看 免费下载 AutoBangumi 的解析器(Parser)负责从 RSS 条目标题中抽取结构化的番剧元数据&am… · 2026/9/27 7:57:21

换机照片怎么迁移才靠谱?6种方案对比,原图与备份一次讲清
换机照片怎么迁移才靠谱?6种方案对比,原图与备份一次讲清

换手机时,照片迁移最需要关注的不是单纯的“速度”,而是文件有没有完整过去、原始信息有没有变化,以及迁移完成后有没有备用副本。如果只有几百张照片,手机直连通常就能解决;但面对几千甚至上万张照片,尤其… · 2026/9/27 7:57:21

不良网站举报中心官网搭建避坑:5步搞定域名服务器配置
不良网站举报中心官网搭建避坑:5步搞定域名服务器配置

不良网站举报中心官网搭建避坑:5步搞定域名服务器配置 很多刚接手这类敏感项目的朋友,第一反应就是头大。域名备案卡住、服务器被墙、SSL证书报错,这些“域名服务器搞不懂”的瞬间,足以让一个上线计划推迟半个月。其实,这类涉及公共利益的… · 2026/9/27 8:42:55

如何免费导出并分析全部微信聊天记录:WeChatMsg 使用指南
如何免费导出并分析全部微信聊天记录:WeChatMsg 使用指南

如何免费导出并分析全部微信聊天记录:WeChatMsg 使用指南 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/We… · 2026/9/27 8:42:43

Chaos Mesh 深入解析:Kubernetes 云原生混沌工程平台的架构、特性与快速上手指南
Chaos Mesh 深入解析:Kubernetes 云原生混沌工程平台的架构、特性与快速上手指南

云原生运维测试可观测性 【免费下载链接】chaos-mesh A Chaos Engineering Platform for Kubernetes. 项目地址: https://gitcode.com/gh_mirrors/ch/chaos-mesh 点击查看 免费下载 Chaos Mesh 是一个开源的、云原生的 Kubernetes 混沌工程平台,它通过 … · 2026/9/27 8:42:43

GPUI Kit 编码指南:Rust 桌面应用可维护架构的 9 个实战决策
GPUI Kit 编码指南:Rust 桌面应用可维护架构的 9 个实战决策

GPUI Kit 编码指南:Rust 桌面应用可维护架构的 9 个实战决策 【免费下载链接】gpui-kit Rust GUI components for building fantastic cross-platform desktop application by using GPUI. 项目地址: https://gitcode.com/GitHub_Trending/gp/gpui-kit 本文以… · 2026/9/27 8:42:43

一文搞懂免费的网站开发软件,别让建站公司拖你一周
一文搞懂免费的网站开发软件,别让建站公司拖你一周

一文搞懂免费的网站开发软件,别让建站公司拖你一周 改个需求建站公司拖一周,你加急催单对方说排期满了,这种憋屈感谁懂?很多运营和新手老板都被这种外包流程坑过,明明只是换个Banner或者加个表单,沟通成本比开发成本还高。其实根本问题在于,你手… · 2026/9/27 8:42:43

notepad-- 使用教程:双栏文件对比、整库批量替换与主题定制
notepad-- 使用教程:双栏文件对比、整库批量替换与主题定制

notepad-- 使用教程:双栏文件对比、整库批量替换与主题定制 【免费下载链接】notepad-- 一个支持windows/linux/mac的文本编辑器,目标是做中国人自己的编辑器,来自中国。 项目地址: https://gitcode.com/GitHub_Trending/no/notepad-- … · 2026/9/27 8:42:37

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码