T301. 删除无效的括号

给你一个由若干括号和字母组成的字符串 s ,删除最小数量的无效括号,使得输入的字符串有效。

返回所有可能的结果。答案可以按 任意顺序 返回。

 

示例 1:

输入:s = "()())()"
输出:["(())()","()()()"]
示例 2:

输入:s = "(a)())()"
输出:["(a())()","(a)()()"]
示例 3:

输入:s = ")("
输出:[""]
 

提示:

1 <= s.length <= 25
s 由小写英文字母以及括号 '(' 和 ')' 组成
s 中至多含 20 个括号

 

解体思路:回溯

DFS或BFS的选择:

为什么不选择DFS,本题带有一个关键性限制【删除最小数量的无效括号】,说明在搜索时,不但要求找到匹配括号字符串,也要求删除的括号数量最少,可以事先求得需要删除的最少括号数量

但是在深度搜索时,由于搜索特性,在遇到"(((((((((((((aaaaa"这种输入时,会发生超时限制,这种情况下即使通过求得删除的最少括号数量剪枝,仍会超时。

BFS在搜索时,如果在每一层都丢弃一个括号,那么在第n层时,已经自动匹配了删除n个括号的情况,这样可以在搜索深度较浅时仍能求得解。

 

 1 class Solution:
 2 
 3     def check(self, string):
 4         cnt = 0
 5         for i in string:
 6             if i == "(":
 7                 cnt += 1
 8             elif i == ")":
 9                 cnt -= 1
10             if cnt < 0:
11                 return False
12         return cnt == 0
13 
14     def removeInvalidParentheses(self, s: str):
15         level = {s}
16         while True:
17             valid = list(filter(self.check, level))
18             if valid:
19                 return valid
20             next_level = set()
21             for string in level:
22                 for i in range(len(string)):
23                     if string[i] in ["(", ")"]:
24                         next_level.add(string[:i] + string[i + 1:])
25             level = next_level
26 
27 
28 a = Solution()
29 print(a.removeInvalidParentheses("()())()"))

 

posted @ 2021-10-27 18:13  散装英语king  阅读(43)  评论(0编辑  收藏  举报