301. Remove Invalid Parentheses

301. Remove Invalid Parentheses

from typing import List

class Solution:
    def removeInvalidParentheses(self, s: str) -> List[str]:
        self.min_removed = float('inf')
        self.valid = set() 

        def backtrack(idx, left_count, right_count, curr, ignored):
            # [優化] 剪枝:如果目前刪除的數量已經超過已知最小值,就不用繼續了
            if ignored > self.min_removed:
                return

            if idx == len(s):
                if left_count == right_count:
                    # 找到更佳解:更新最小值,並重置結果集
                    if ignored < self.min_removed:
                        self.min_removed = ignored
                        self.valid = set()
                        self.valid.add("".join(curr))
                    # 找到同樣好的解:加入結果集
                    elif ignored == self.min_removed:
                        self.valid.add("".join(curr))
                return

            char = s[idx]

            # 情況 1: 不是括號,直接加入
            if char != '(' and char != ')':
                curr.append(char)
                backtrack(idx + 1, left_count, right_count, curr, ignored)
                curr.pop()
            else:
                # 情況 2: 是括號
                
                # 選項 A: 刪除 (Ignore) 這個括號
                backtrack(idx + 1, left_count, right_count, curr, ignored + 1)

                # 選項 B: 保留 (Keep) 這個括號
                curr.append(char)
                if char == '(':
                    backtrack(idx + 1, left_count + 1, right_count, curr, ignored)
                elif right_count < left_count:
                    # 只有在右括號數量小於左括號時,才能加入右括號 (剪枝無效狀態)
                    backtrack(idx + 1, left_count, right_count + 1, curr, ignored)
                
                curr.pop()

        backtrack(0, 0, 0, [], 0)
        return list(self.valid)