잘못된 괄호 제거

2310 단어 theabbieleetcodedsa
괄호와 문자를 포함하는 문자열s이 주어지면 유효하지 않은 괄호의 최소 개수를 제거하여 입력 문자열을 유효하게 만드십시오.

가능한 모든 결과를 반환합니다. 어떤 순서로든 답변을 반환할 수 있습니다.

예 1:

입력: s = "()())()"
출력: ["(())()","()()()"]

예 2:

입력: s = "(a)())()"
출력: ["(a())()","(a)()()"]

예 3:

입력: s = ")("
출력: [""]

제약:
  • 1 <= s.length <= 25
  • s는 소문자 영문자와 괄호 '('')'로 구성됩니다.
  • 20에는 최대 s개의 괄호가 있습니다.

  • 해결책:

    class Solution:
        def isValid(self, s: str) -> bool:
            stack = []
            valid = True
            for bracket in s:
                if bracket == '(':
                    stack.append(bracket)
                elif bracket == ')':
                    if len(stack) > 0:
                        if stack.pop() + bracket != '()':
                            valid = False
                            break
                    else:
                        valid = False
                        break
            if len(stack) > 0:
                valid = False
            return valid
    
        def removeInvalidParentheses(self, s: str) -> List[str]:
            n = len(s)
            paths = [("", 0, 0)]
            btoi = { '(': 1, ')': -1 }
            i = 0
            mindels = n
            op = set()
            visited = set()
            while i < len(paths):
                curr, j, currctr = paths[i]
                if j == n:
                    if self.isValid(curr):
                        if n - len(curr) < mindels:
                            mindels = n - len(curr)
                            op = { curr }
                        elif n - len(curr) == mindels:
                            op.add(curr)
                if j < n and j - len(curr) <= mindels:
                    nctr = currctr + btoi.get(s[j], 0)
                    if nctr >= 0 and (curr + s[j], j + 1) not in visited:
                        visited.add((curr + s[j], j + 1))
                        paths.append((curr + s[j], j + 1, nctr))
                    if s[j] == '(' or s[j] == ')' and (curr, j + 1) not in visited:
                        visited.add((curr, j + 1))
                        paths.append((curr, j + 1, currctr))
                i += 1
            return list(op)
    

    좋은 웹페이지 즐겨찾기