刪除無效的括號

在這裏插入圖片描述

考察知識點

回溯,深度搜索

思路一

給定字符串:①首先求出不匹配的左括號數和右括號數。
②在深度搜索過程中去除不匹配的符號,舉例()())()
③當左括號數等於右括號數時,判斷是否匹配

代碼

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):
                self.res.append(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 = {s}
        count = {"(": 0, ")": 0}
        #從左到右,去除不匹配的右括號
        for i, c in enumerate(s):
            if c == ")" and count["("] == count[")"]:
                new_results = set()
                while results:
                    result = results.pop()
                    new_results |= {result[:j] + result[j + 1:] for j in range(i - removed + 1) if result[j] == ")"}
                results = new_results
                removed += 1
            else:
                if c in count:
                    count[c] += 1
        count = {"(": 0, ")": 0}
        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 |= {result[:j] + result[j + 1:] for j in range(ii, ll) if result[j] == "("}
                results = new_results
                ll -= 1
            else:
                if c in count:
                    count[c] += 1
        return list(results)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章