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
}
}