题目
给你一个由若干括号和字母组成的字符串 s ,删除最小数量的无效括号,使得输入的字符串有效。
返回所有可能的结果。答案可以按 任意顺序 返回。
示例 1:
输入:s = "()())()"
输出:["(())()","()()()"]
示例 2:
输入:s = "(a)())()"
输出:["(a())()","(a)()()"]
示例 3:
输入:s = ")("
输出:[""]
提示:
1 <= s.length <= 25
s 由小写英文字母以及括号 '(' 和 ')' 组成
s 中至多含 20 个括号
来源:力扣(LeetCode)
链接:原文链接
思路
所有的合法字符串中左括号的数量与右括号数量相等。因此可以得出合法字符串判断函数:
记左括号的得分为 1;右括号的得分为−1,合法的方案的最终得分必为0。
之后可以采用BFS的方法,每次删除一个 '(' 或者 ')',看有没有合法的,一旦有合法的就返回,则结果一定是删除括号最少的。其中,用set
作为队列,排除掉重复结果。
class Solution:
def removeInvalidParentheses(self, s: str) -> List[str]:
#判断字符串中括号是否有效
def check(string):
#记录字符串得分,左括号+1,右括号-1
count = 0;
for c in string:
if c == '(':
count+=1
elif c == ')':
count-=1
#当右括号多于左括号时,直接判定无效无需等待遍历结束
if count < 0:
return False
#遍历结束后:左右相等 或 左>右,只有左右括号数量相等时有效
return count == 0
queue={s}
while queue:
#检查有无合法字符串
res=list(filter(check,queue))
#有,直接返回则就是删除最少的
if res:
return res
#用set去重
temp=set()
for v in queue:
for i in range(len(v)):
if v[i]=='(' or v[i]==')':
temp.add(v[0:i]+v[i+1:len(v)])
queue=temp
#没有合法的字符串,返回空
return [""]