301. 删除无效的括号(困难)
题目描述:
给你一个由若干括号和字母组成的字符串 s ,删除最小数量的无效括号,使得输入的字符串有效。
返回所有可能的结果。答案可以按 任意顺序 返回。
考察重点:题目要求找到合法且删除最少括号的情况,所以可以想到使用BFS。维护两个字符串数组cur和next,每次遍历cur并删除任意元素,任意位置上的一个 ‘(’ 或 ‘)’,并加入新的字符串数组next,使用isValid判断每一轮数组中是否有合法的字符串,一旦有,立刻返回结果数组。
这里使用set替换字符串数组,以此来去重
func isValid(str string) bool { //判断符号是否符合规则cnt := 0for _, 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: {}} //将初始字符串存入setfor {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}
}