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("()())()"))