难度困难122
如果你熟悉 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
用以表示一组基于题目描述中语法构造的字符串class Solution {TreeSet s = new TreeSet<>();public List braceExpansionII(String expression) {dfs(expression);return new ArrayList<>(s);}public void dfs(String exp){int j = exp.indexOf('}');//首先找到第一个右花括号的位置 jif(j == -1){//如果找不到,说明 exp 中没有右花括号,即 exp 为单一元素s.add(exp);return;}// 否则,我们从位置 j 开始往左找到第一个左花括号的位置 iint 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(",")){// 依次遍历花括号内的bi,拼接成新表达式递归处理dfs(a+b+c);}}
}