class Solution {
public:
vector<string> braceExpansionII(string expression) {
}
};
1096. 花括号展开 II
如果你熟悉 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
用以表示一组基于题目描述中语法构造的字符串相似题目
原站题解
java 解法, 执行用时: 22 ms, 内存消耗: 42.4 MB, 提交时间: 2023-03-07 10:05:49
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); } } }
golang 解法, 执行用时: 12 ms, 内存消耗: 6.1 MB, 提交时间: 2023-03-07 10:05:09
func braceExpansionII(expression string) []string { s := map[string]struct{}{} var dfs func(string) dfs = func(exp string) { j := strings.Index(exp, "}") if j == -1 { s[exp] = struct{}{} return } i := strings.LastIndex(exp[:j], "{") a, c := exp[:i], exp[j+1:] for _, b := range strings.Split(exp[i+1:j], ",") { dfs(a + b + c) } } dfs(expression) ans := make([]string, 0, len(s)) for k := range s { ans = append(ans, k) } sort.Strings(ans) return ans }
python3 解法, 执行用时: 68 ms, 内存消耗: 15.6 MB, 提交时间: 2023-03-07 10:02:58
''' 递归 ''' class Solution: def braceExpansionII(self, expression: str) -> List[str]: def dfs(exp: str): j = exp.find('}') if j == -1: s.add(exp) return i = exp.rfind('{', 0, j - 1) # 找到匹配}的{ a, c = exp[:i], exp[j + 1:] # a 为exp的前缀,c为exp的后缀 for b in exp[i + 1: j].split(','): dfs(a + b + c) s = set() dfs(expression) return sorted(s)