1. 程式人生 > 其它 >T301. 刪除無效的括號

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