题目
删除最小数量的无效括号,使得输入的字符串有效,返回所有可能的结果。
说明: 输入可能包含了除 (
和 )
以外的字符。
示例 1:
输入: "()())()"
输出: ["()()()", "(())()"]
示例 2:
输入: "(a)())()"
输出: ["(a)()()", "(a())()"]
示例 3:
输入: ")("
输出: **[""]
方案一(BFS)
class Solution:
def removeInvalidParentheses(self, s: str) -> List[str]:
# 利用BFS理解起来要远远比DFS要简单的多,因为这道题说的是删除最少的括号!!
# 如果我们每次只删除一个括号,然后观察被删除一个括号后是否合法,如果已经合法了,我们就不用继续删除了。
# 因此我们并不需要将遍历进行到底,而是层层深入,一旦达到需求,就不再深入了。
def isValid(string) -> bool:
'''判断一个字符串是否合法'''
cnt = 0
for c in string:
if c == "(":
cnt += 1
elif c == ")":
cnt -= 1
if cnt < 0:
return False
if cnt == 0:
return True
return False
# BFS算法
levels = {s}
while True:
validates = list(filter(isValid, levels))
if validates:
return validates
# 去除一个 "(" 或 ")"
next_levels = set()
for level in levels:
for i in range(len(level)):
if level[i] == "(" or level[i] == ")":
next_levels.add(level[:i]+level[i+1:])
levels = next_levels
原文
https://leetcode-cn.com/explore/interview/card/2020-top-interview-questions/288/graph/1290/
https://leetcode-cn.com/problems/remove-invalid-parentheses/solution/bfsjian-dan-er-you-xiang-xi-de-pythonjiang-jie-by-/