2021-10-27

LeetCode每日一题

301. 删除无效的括号

解题思路:回溯+剪枝算法

执行用时:2260 ms, 在所有 Python3 提交中击败了9.08%的用户

内存消耗:15.2 MB, 在所有 Python3 提交中击败了54.07%的用户

from typing import List


class Solution:
    def removeInvalidParentheses(self, s: str) -> List[str]:
        queue = list()
        results = [len(s),list()]
        self.trace_back(s, queue, 0, 0, 0, results)
        return results[1]

    def trace_back(self, s, queue, index, left_num, remove_num, results):
        if len(s) == index:
            if left_num == 0:
                # print(queue)
                new_s = "".join(queue)
                if remove_num == results[0]:
                    if new_s not in results[1]:
                        results[1].append(new_s)
                elif remove_num < results[0]:
                    results[1] = [new_s]
                    results[0] = remove_num
            # else:
                # print("失败的顺序")
            return

        # 判断是否为字符串
        current_s = s[index]
        #     # 判断是否为")"
        if current_s == ")":
            # 选择添加或者移除
            if left_num > 0:
                # 进行添加操作
                queue.append(current_s)
                self.trace_back(s, queue, index + 1, left_num - 1, remove_num,results)
                queue.pop()

            # 移除操作
            self.trace_back(s, queue, index + 1, left_num, remove_num + 1,results)
        elif current_s == "(":
            # 选择添加或移除
            # 添加
            queue.append(current_s)
            self.trace_back(s, queue, index + 1, left_num + 1, remove_num,results)
            queue.pop()

            # 移除
            self.trace_back(s, queue, index + 1, left_num, remove_num,results)

        else:
            # 字符的添加
            queue.append(s[index])
            self.trace_back(s, queue, index + 1, left_num, remove_num,results)
            queue.pop()


if __name__ == '__main__':
    s = "(a)())()"
    # s = ")("
    # s = "()())()"
    solution = Solution()
    parentheses = solution.removeInvalidParentheses(s)
    print(parentheses)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值