【1096. 花括号展开 II】
创始人
2024-05-30 06:57:39
0

来源:力扣(LeetCode)

描述:

如果你熟悉 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:

输入: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 <= 60
  • expression[i] 由 ‘{’,‘}’,‘,’ 或小写英文字母组成
  • 给出的表达式 expression 用以表示一组基于题目描述中语法构造的字符串

方法:递归解析

思路与算法

表达式可以拆分为多个子表达式,以逗号分隔或者直接相接。我们应当先按照逗号分割成多个子表达式进行求解,然后再对所有结果求并集。这样做的原因是求积的优先级高于求并集的优先级。

我们用 expr 表示一个任意一种表达式,用 term 表示一个最外层没有逗号分割的表达式,那么 expr 可以按照如下规则分解:

expr → term ∣ term, expr

其中的 ∣ 表示或者,即 expr 可以分解为前者,也可以分解为后者。

再来看 term, term 可以由小写英文字母或者花括号包括的表达式直接相接组成,我们用 item 来表示每一个相接单元,那么 term 可以按照如下规则分解:

term → item ∣ item term

item 可以进一步分解为小写英文字母 letter 或者花括号包括的表达式,它的分解如下:

item → letter ∣ {expr}

在代码中,我们编写三个函数,分别负责以上三种规则的分解:

  1. expr 函数,不断的调用 term,并与其结果进行合并。如果匹配到表达式末尾或者当前字符不是逗号时,则返回。
  2. term 函数,不断的调用 item,并与其结果求积。如果匹配到表达式末尾或者当前字符不是小写字母,并且也不是左括号时,则返回。
  3. item 函数,根据当前字符是不是左括号来求解。如果是左括号,则调用 expr,返回结果;否则构造一个只包含当前字符的字符串集合,返回结果。

以下示意图以 {a,b}{c,{d,e}} 为例,展示了表达式递归拆解以及回溯的全过程。

1.png
2.png
在代码实现过程中有以下细节:

  1. 维护一个外部指针来遍历整个表达式,或者将表达式和当前遍历下标以引用的方式传递给被调函数。
  2. 因为最终答案需要去重,所以可以先用集合来求解中间结果,最后再转换成已排序的列表作为最终答案。

代码:

class Solution {string expression;int idx;// item -> letter | { expr }set item() {set ret;if (expression[idx] == '{') {idx++;ret = expr();} else {ret = {string(1, expression[idx])};}idx++;return move(ret);}// term -> item | item termset term() {// 初始化空集合,与之后的求解结果求笛卡尔积set ret = {""};// item 的开头是 { 或小写字母,只有符合时才继续匹配while (idx < expression.size() && (expression[idx] == '{' || isalpha(expression[idx]))) {auto sub = item();set tmp;for (auto &left : ret) {for (auto &right : sub) {tmp.insert(left + right);}}ret = move(tmp);}return move(ret);}// expr -> term | term, exprset expr() {set ret;while (true) {// 与 term() 求解结果求并集ret.merge(term());// 如果匹配到逗号则继续,否则结束匹配if (idx < expression.size() && expression[idx] == ',') {idx++;continue;} else {break;}}return move(ret);}public:vector braceExpansionII(string expression) {this->expression = expression;this->idx = 0;auto ret = expr();return {ret.begin(), ret.end()};}
};

执行用时:8 ms, 在所有 C++ 提交中击败了89.66%的用户
内存消耗:10 MB, 在所有 C++ 提交中击败了87.36%的用户
复杂度分析
时间复杂度:O(nlogn),其中 n 是 expression 的长度。整个
expression 只会遍历一次,时间复杂度为 O(n),集合合并以及求积运算的时间复杂度为 O(nlogn),因此总的时间复杂度为 O(nlogn)。
空间复杂度:O(n)。递归过程所需的栈空间为 O(n),以及存放中间答案的空间复杂度为 O(n),因此总的空间复杂度为 O(n)。
author:LeetCode-Solution

相关内容

热门资讯

走走停停五年级作文【精简3篇... 走走停停五年级作文 篇一:我的暑假生活暑假已经到来了,我迫不及待地计划着如何度过这个美好的假期。我和...
教室里的掌声作文600字四年... 教室里的掌声作文600字四年级 篇一教室里的掌声今天,当我走进教室的时候,一阵热烈的掌声迎接着我。我...
四年级写景作文【通用6篇】 四年级写景作文 篇一秋天的森林今天我来到了一个美丽的森林,这是我第一次来到这里,我迫不及待地想探索一...
美丽的校园就像我的家四年级作... 篇一:美丽的校园就像我的家在我眼中,学校就像我的第二个家。它不仅给予了我学习的机会和知识的智慧,更重...
优秀文章《童年趣事》【最新5... 优秀文章《童年趣事》 篇一小时候,我和爷爷奶奶住在一个小村庄里。那里的生活简单而宁静,我们的童年充满...
四年级200字校园作文大全【... 四年级200字校园作文大全 篇一我的校园生活我是一名四年级的学生,我喜欢我的校园生活。在校园里,我有...
寒假里的新鲜事四年级作文50... 篇一:寒假里的新鲜事寒假里的新鲜事四年级作文500字 篇一寒假终于来了,我和爸爸妈妈一起去了北京旅游...
描写春天的四年级作文400字... 描写春天的四年级作文400字 篇一春天的颜色春天是一个充满色彩的季节。当冬天的寒冷逐渐消散,春姑娘轻...
登碧云峰四年级作文(优秀3篇... 登碧云峰四年级作文 篇一我的暑假生活暑假来临了,我迫不及待地来到了碧云峰。碧云峰是一个美丽的山脉,被...
我爱我家四年级优秀满分作文(... 我爱我家四年级优秀满分作文 篇一家,是我最温暖的港湾家是一个人最亲近的地方,我也不例外。我爱我家,因...
我也有犯错的时候小学生作文(... 我也有犯错的时候小学生作文 篇一我也有犯错的时候我是一个小学生,虽然我还小,但是我也会犯错。每个人都...
向你介绍我400字作文四年级... 向你介绍我400字作文四年级作文 篇一我叫小明,是一个四年级的学生。今天我要向你介绍一下我自己。首先...
四年级上册第六单元作文记一次... 四年级上册第六单元作文记一次游戏 篇一我最喜欢的游戏是“捉迷藏”。这个游戏非常有趣,不仅能锻炼我们的...
低头族作文四年级【通用6篇】 低头族作文四年级 篇一低头族的危害如今,低头族成为了一个非常流行的词汇。低头族指的是那些长时间低头看...
四年级上册作文新学期新鲜事(... 四年级上册作文新学期新鲜事 篇一新学期开始了,我迫不及待地走进了教室,发现自己的座位旁边多了一个新同...
博饼四年级作文【最新3篇】 博饼四年级作文 篇一我的博饼经历今天是中秋节,我参加了学校举办的博饼活动。这是我第一次参加博饼,我非...
四年级作文小河的自述【优秀6... 四年级作文小河的自述 篇一我是一条小河,我从山上的泉源处开始,蜿蜒流淌过一个美丽的村庄。我见证了这里...
公园四年级作文【精选6篇】 公园四年级作文 篇一:我的公园之旅今天,我和爸爸妈妈一起去了附近的公园。公园里绿树成荫,花香四溢,充...
校园的春天四年级作文400字... 校园的春天四年级作文400字 篇一春天是一个充满生机和希望的季节,而校园的春天更是美丽而多彩的。每年...
我和神笔马良过一天四年级作文... 我和神笔马良过一天四年级作文 篇一在一个晴朗的周末早晨,我和神笔马良一起度过了一个奇幻的一天。早上醒...