【每日一题Day139】LC1096花括号展开 I dfs

简介: 【每日一题Day139】LC1096花括号展开 I dfs

花括号展开 II【LC1096】

如果你熟悉 Shell 编程,那么一定了解过花括号展开,它可以用来生成任意字符串。

花括号展开的表达式可以看作一个由 花括号逗号小写英文字母 组成的字符串,定义下面几条语法规则:

  • 如果只给出单一的元素 x,那么表达式表示的字符串就只有 “x”。R(x) = {x}
  • 例如,表达式 "a" 表示字符串 "a"
  • 而表达式 "w" 就表示字符串 "w"
  • 当两个或多个表达式并列,以逗号分隔,我们取这些表达式中元素的并集。
R({e_1,e_2,...}) = R(e_1) ∪ R(e_2) ∪ ...
  • 例如,表达式 "{a,b,c}" 表示字符串 "a","b","c"
  • 而表达式 "{{a,b},{b,c}}" 也可以表示字符串 "a","b","c"
  • 要是两个或多个表达式相接,中间没有隔开时,我们从这些表达式中各取一个元素依次连接形成字符串。
R(e_1 + e_2) = {a + b for (a, b) in R(e_1) × R(e_2)}
  • 例如,表达式 "{a,b}{c,d}" 表示字符串 "ac","ad","bc","bd"。
  • 表达式之间允许嵌套,单一元素与表达式的连接也是允许的。
  • 例如,表达式 "a{b,c,d}" 表示字符串 "ab","ac","ad"
  • 例如,表达式 "a{b,c}{d,e}f{g,h}" 可以表示字符串 "abdfg", "abdfh", "abefg", "abefh", "acdfg", "acdfh", "acefg", "acefh"

给出表示基于给定语法规则的表达式 expression,返回它所表示的所有字符串组成的有序列表

假如你希望以「集合」的概念了解此题,也可以通过点击 “显示英文描述” 获取详情。

先去做了花括号1也做不出来,好难啊,想不出来

  • 思路:
  • 明确以下几点
  • 表达式中有两种运算方式:并集相当于加、相接相当于乘
  • 逗号代表子表达式中可以选择的选项,相当于并集
  • 如果当前字符是’{‘或者字母并且前一个字符为’}'时,为相接需要采用成操作
  • 我们应该优先求取相接的结果,然后最后求取并集,将每个结果放入结果集中。
  • 可以使用递归的方式处理表达式,按照顺序处理花括号,枚举花括号中的可选项,拼接新的表达式,进行dfs搜索,最后如果没有花括号了,那么可以直接将结果放入。最后将结果按照字典顺序排序
  • 递归函数
  • 返回值以及参数
  • exp(字符串表达式)
  • 全局变量:TreeSet<String>(存放符合条件结果的集合,按字典顺序排序)
  • 终止条件

     当表达式中没有右花括号时,直接将结果加入返回

  • 遍历过程
    先找到第一个右花括号的位置j,然后从j向左搜索第一个第一个左花括号i,那么可以将字符串分为a=exp[:,i],b=exp[i+1,j],c=exp[j,n1],花括号里面的部分b可以按照逗号分为多个字符串bi,对于每个bi,我们将其拼接成新的表达式a+bi+c然后递归处理新的表达式
class Solution {
    private TreeSet<String> s = new TreeSet<>();
    public List<String> braceExpansionII(String expression) {
        dfs(expression);
        return new ArrayList<>(s);
    }
    private void dfs(String exp) {
        int j = exp.indexOf('}');
        if (j == -1) {
            s.add(exp);
            return;
        }
        int i = j;
        while (exp.charAt(i) != '{') {
            --i;
        }
        String a = exp.substring(0, i);
        String c = exp.substring(j + 1);
        for (String b : exp.substring(i + 1, j).split(",")) {
            dfs(a + b + c);
        }
    }
}
作者:ylb
链接:https://leetcode.cn/problems/brace-expansion-ii/solutions/2152366/python3javacgotypescript-yi-ti-yi-jie-di-gs64/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

复杂度

  • 时间复杂度:O(n2n/4)
  • 空间复杂度:O(1)
目录
相关文章
|
JavaScript 前端开发 Dubbo
注册中心设计 Ap 与 CP 区别|学习笔记
快速学习注册中心设计 Ap 与 CP 区别
1431 0
注册中心设计 Ap 与 CP 区别|学习笔记
|
网络协议 前端开发 网络安全
自建Alist共享网盘网站
由于百度网盘下载限速,所以就用了天翼云,坚果云,阿里云等,结果每次都要登录,就很拉跨, 所以在这里部署一套共享alist网盘,实现随时随地,只要有网,开箱即用。
7616 1
|
关系型数据库 MySQL Linux
让安装变简单:Linux下安装Mysql一篇文章搞定
让安装变简单:Linux下安装Mysql一篇文章搞定
514 0
|
11月前
|
SQL 监控 关系型数据库
【紧急救援】MySQL CPU 100%!一套组合拳教你快速定位并解决!
凌晨三点MySQL CPU飙至100%,业务瘫痪!本文亲历30分钟应急排障全过程:从紧急止血、定位慢查询、分析锁争用,到优化SQL与索引,最终恢复服务。总结一套可复用的排查路径与预防方案,助你告别深夜救火。
|
6月前
|
人工智能 安全 Linux
OpenClaw技能生态与部署全解:热门技能、阿里云/本地部署、模型API配置与安全实践
截至2026年3月,OpenClaw作为主流开源AI Agent框架,其技能生态已进入成熟阶段,官方技能市场ClawHub收录技能突破**13700+**,社区精选库Awesome OpenClaw Skills过滤低质量与恶意条目后保留**5490+**高质量技能,覆盖办公、研发、创作、生活、安全等全场景,日均新增技能40-60个,峰值用户规模超220万。本文完整梳理OpenClaw技能生态全景、2026年必装热门技能、全平台部署流程、大模型API配置方案与安全实践,帮助用户快速搭建稳定、高效、可扩展的AI Agent系统。
1113 3
|
11月前
|
人工智能 运维 Kubernetes
技术人的知识输出利器:一套高质量知乎回答生成指令模板
本文提供一套系统化知乎高赞回答生成模板,结合AI工具(如DeepSeek、通义千问),助力技术人高效输出高质量内容。涵盖结构框架、质量检查、实战示例与合规建议,提升表达清晰度与内容价值,适用于经验分享、技术科普等多种场景,实现知识输出的标准化与高效化。
1188 4
|
前端开发 JavaScript 关系型数据库
基于Python+Vue开发的商城管理系统源码+运行步骤
基于Python+Vue开发的商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Python编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Python的网上商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
635 7
|
8月前
|
Web App开发 Windows
fdm_x64_setup_6.14.2.3973使用步骤详解(附安装与下载教程)
FDM(Free Download Manager)是一款免费多功能下载工具,支持HTTP、FTP、BT、磁力链,具备断点续传、下载加速功能。安装简便,支持浏览器集成,可批量下载、限速管理,显著提升下载效率,是替代浏览器自带下载器的优选方案。
1385 7
|
人工智能 Java API
MCP客户端调用看这一篇就够了(Java版)
本文详细介绍了MCP(Model Context Protocol)客户端的开发方法,包括在没有MCP时的痛点、MCP的作用以及如何通过Spring-AI框架和原生SDK调用MCP服务。文章首先分析了MCP协议的必要性,接着分别讲解了Spring-AI框架和自研SDK的使用方式,涵盖配置LLM接口、工具注入、动态封装工具等步骤,并提供了代码示例。此外,还记录了开发过程中遇到的问题及解决办法,如版本冲突、服务连接超时等。最后,文章探讨了框架与原生SDK的选择,认为框架适合快速构建应用,而原生SDK更适合平台级开发,强调了两者结合使用的价值。
14690 33
MCP客户端调用看这一篇就够了(Java版)
|
11月前
|
存储 安全 数据可视化
什么是CMS?如何选择CMS建设网站
本文介绍CMS的核心概念、构成及优势,以PageAdmin为例,指导用户选择和使用合适的CMS工具。
1372 2