回溯,深度搜尋
給定字串:①首先求出不匹配的左括號數和右括號數。
②在深度搜尋過程中去除不匹配的符號,舉例()())()
③當左括號數等於右括號數時,判斷是否匹配
class solution(object):
def removeinvalidparentheses(self, s):
""":type s: str
:rtype: list[str]
"""self.res=
left=0
right=0
#求出不匹配的左括號數和右括號數
for i in s:
if i=="(":
left+=1
if i==")":
if left>0:left-=1
else: right+=1
self.dfs(s,0,left,right)
return self.res
return list(set(self.res))
def dfs(self,s,st,l,r):
if l==0 and r==0:
if self.check(s):
return
for i in range(st,len(s)):
if i-1>=st and s[i]==s[i-1]:continue #去除重複,例如()())()中的位置3和4
if l>0 and s[i]=="(":
self.dfs(s[0:i]+s[(i+1):],i,l-1,r)
if r>0 and s[i]==")":
self.dfs(s[0:i]+s[(i+1):],i,l,r-1)
#去掉左括號數等於右括號數,但是不匹配的組合,例如()())(
def check(self,s):
cnt=0
for i in s:
if i=="(":
cnt+=1
if i==")":
cnt-=1
if cnt<0:
return false
return cnt==0
採用兩個方向處理字串,首先從做到右,然後從右到左。
class solution(object):
def removeinvalidparentheses(self, s):
""":type s: str
:rtype: list[str]
"""removed = 0
results =
count =
#從左到右,去除不匹配的右括號
for i, c in enumerate(s):
if c == ")" and count["("] == count[")"]:
new_results = set()
while results:
result = results.pop()
new_results |=
results = new_results
removed += 1
else:
if c in count:
count[c] += 1
count =
i = len(s)
ll = len(s) - removed
#從右到左,去除不匹配的左括號
for ii in range(ll - 1, -1, -1):
i -= 1
c = s[i]
if c == "(" and count["("] == count[")"]:
new_results = set()
while results:
result = results.pop()
new_results |=
results = new_results
ll -= 1
else:
if c in count:
count[c] += 1
return list(results)
刪除無效的括號
刪除最小數量的無效括號,使得輸入的字串有效,返回所有可能的結果。說明 輸入可能包含了除 和 以外的字元。示例 1 輸入 輸出 示例 2 輸入 a 輸出 a a 示例 3 輸入 輸出 public list removeinvalidparentheses string s 如果遇到右擴號 if s....
LeetCode BFS 刪除無效的括號
刪除最小數量的無效括號,使得輸入的字串有效,返回所有可能的結果。說明 輸入可能包含了除 和 以外的字元。示例 輸入 輸出 輸入 a 輸出 a a 輸入 輸出 class solution if isvalid s return queueq unordered setlookup 記錄字串是否被訪問...
301 刪除無效的括號(BFS)
刪除最小數量的無效括號,使得輸入的字串有效,返回所有可能的結果。說明 輸入可能包含了除 和 以外的字元。示例 1 輸入 輸出 示例 2 輸入 a 輸出 a a 示例 3 輸入 輸出 思路 廣度優先 bfs 廣度優先 bfs public listremoveinvalidparentheses st...