给你一个由若干括号和字母组成的字符串 s
,删除最小数量的无效括号,使得输入的字符串有效。
返回所有可能的结果。
示例 1:
输入:s = "()())()" 输出:["(())()","()()()"]
示例 2:
输入:s = "(a)())()" 输出:["(a())()","(a)()()"]
示例 3:
输入:s = ")(" 输出:[""]
提示:
1 <= s.length <= 25
s
由小写英文字母以及括号'('
和')'
组成s
中至多含20
个括号
思路:DFS
class Solution:
def removeInvalidParentheses(self, s: str) -> List[str]:
if not s: return [""]
l,r = 0,0
# 计算多余的左右括号数
for s_i in s:
if s_i == "(":
l += 1
if s_i == ")" and l == 0:
r += 1
elif s_i == ")":
l -= 1
result = []
self.dfs(s, result, r, l, 0)
return result
#判断字符串是否有效
def is_valid(self,s):
count = 0
for s_i in s:
if s_i == "(":
count += 1
if s_i == ")":
count -= 1
if count < 0:
return False
return count == 0
#DFS
def dfs(self, s, result, r, l, start):
if l == 0 and r == 0 and self.is_valid(s):
result.append(s)
return
for i in range(start, len(s)):
if i != start and s[i] == s[i - 1]: continue
if s[i] == "(" or s[i] == ")":
current = s[0:i] + s[i + 1:]
if r > 0: self.dfs(current, result, l, r-1, i)
elif l > 0: self.dfs(current, result, l-1, r, i)
return