LeetCode—301. 删除无效的括号(困难)

301. 删除无效的括号(困难)

题目描述:
给你一个由若干括号和字母组成的字符串 s ,删除最小数量的无效括号,使得输入的字符串有效。

返回所有可能的结果。答案可以按 任意顺序 返回。
在这里插入图片描述
考察重点:题目要求找到合法且删除最少括号的情况,所以可以想到使用BFS。维护两个字符串数组cur和next,每次遍历cur并删除任意元素,任意位置上的一个 ‘(’ 或 ‘)’,并加入新的字符串数组next,使用isValid判断每一轮数组中是否有合法的字符串,一旦有,立刻返回结果数组。
这里使用set替换字符串数组,以此来去重

func isValid(str string) bool { //判断符号是否符合规则
	cnt := 0
	for _, ch := range str {
		if ch == '(' {
			cnt++
		} else if ch == ')' {
			cnt--
			if cnt < 0 {
				return false
			}
		}
	}
	return cnt == 0
}

func RemoveInvalidParentheses(s string) (ans []string) {
	curSet := map[string]struct{}{s: {}} //将初始字符串存入set
	for {
		for str := range curSet {
			if isValid(str) {
				ans = append(ans, str)
			}
		}
		//当curSet中第一次出现符合条件的字符串,立刻返回,ans即是删除最少括号得到的结果
		if len(ans) > 0 {
			return
		}
		nextSet := map[string]struct{}{} //做下一轮迭代
		for str := range curSet {        //对curSet中所有的结果进行下一轮迭代
			for i, ch := range str { //按位删除符号,并将结果串存入下一轮结果集中
				//针对())))))这种情况,其实从i=1到i=6得到的结果是一致的,所以跳过
				if i > 0 && byte(ch) == str[i-1] {
					continue
				}
				if ch == '(' || ch == ')' { //如果是其他字符不管,比如(a)
					nextSet[str[:i]+str[i+1:]] = struct{}{}
				}
			}
		}
		curSet = nextSet
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ostrich5yw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值