目录

1096:花括号展开 II(2348 分)

力扣第 142 场周赛第 4 题

题目

如果你熟悉 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 用以表示一组基于题目描述中语法构造的字符串

相似问题:

分析

  • 典型的用栈模拟递归问题
  • 把单个元素和表达式都看作哈希表,那么
    • 逗号分隔的,取哈希表的并
    • 不分隔的,二重循环得到新的哈希表
    • 为了方便,’{’ 和 ‘,’ 后添加一个初始哈希表,只包含一个空字符串

解答

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
class Solution:
    def braceExpansionII(self, expression: str) -> List[str]:
        sk = [[{''}]]
        for c in expression:
            if c=='{':
                sk.append([{''}])
            elif c==',':
                sk[-1].append({''})
            elif c=='}':
                tmp = {a for A in sk.pop() for a in A}
                sk[-1][-1] = {a+b for a in sk[-1][-1] for b in tmp}
            else:
                sk[-1][-1] = {a+c for a in sk[-1][-1]}
        return sorted(sk[0][0])

3 ms