[leetcode] 1096. 花括号展开 II

[leetcode] 1096. 花括号展开 II

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

如果只给出单一的元素 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 用以表示一组基于题目描述中语法构造的字符串

解:
此方法借助大佬的思想:将整个字符串分解成三段,exp[0:pL],exp[pL+1:pR],exp[pR+1:],pL与pR分别为 第一个"}“左边的第一个”{“的位置 以及 第一个”}"的位置,然后将中间端处理好之后,拼成一个新的string:exp[0:pL],newExp,exp[pR+1:],然后递归运算,最后按字典排序。

func braceExpansionII(expression string) []string {
	m := make(map[string]struct{})
	var pL, pR int
	var dfs func(string)
	dfs = func(exp string) {
		pR = strings.Index(exp, "}")
		if pR == -1 {
			m[exp] = struct{}{}
			return
		}
		pL = strings.LastIndex(exp[:pR], "{")
		if pR == -1 {
			m[exp] = struct{}{}
			return
		}
		el, er := exp[:pL], exp[pR+1:]
		for _, em := range strings.Split(exp[pL+1:pR], ",") {
			dfs(el + em + er)
		}

	}
	dfs(expression)
	res := make([]string, 0, len(m))
	for k := range m {
		res = append(res, k)
	}
    sort.Strings(res)
	return res
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值