美文网首页
301. 删除无效的括号

301. 删除无效的括号

作者: yousa_ | 来源:发表于2020-01-31 18:16 被阅读0次

这道题我个人认为比较经典,里边的思路值得学习
一开始我用回溯的思路没搞出来,参考网友的写了一版。。。


#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author:ShidongDu time:2020/1/31
'''
删除最小数量的无效括号,使得输入的字符串有效,返回所有可能的结果。

说明: 输入可能包含了除 ( 和 ) 以外的字符。

示例 1:

输入: "()())()"
输出: ["()()()", "(())()"]
示例 2:

输入: "(a)())()"
输出: ["(a)()()", "(a())()"]
示例 3:

输入: ")("
输出: [""]

'''
from typing import List
# 我拉了,这道题没搞出来。。。
# class Solution:
#     def removeInvalidParentheses(self, s: str) -> List[str]:
#
#         len_str = len(s)
#         used = [False for _ in range(len_str)]
#         list_s = list(s)
#         res = []
#
#         def _is_complete(string: List[str]) -> bool:
#             '''
#             本函数用以判断string是否是合法字符串
#             :param string:
#             :return:
#             '''
#             res = 0
#             for char in string:
#                 if char == '(':
#                     res -= 1
#                 if char == ')':
#                     res += 1
#                 if res < 0:
#                     return False
#             return res == 0
#
#         def _track_back(depth: int, path: List[str], used: List[bool]):
#             '''
#             回溯函数,用来求得无重复的排列数组
#             :param depth: 当前深度
#             :param path: 当前路径
#             :param used: 元素使用情况
#             :return:
#             '''
#             if _is_complete(path):
#                 res.append(''.join(path))
#                 return
#
#             for i in range(len_str):
#                 if not used[i]:
#                     # 剪枝
#                     if list_s[i]!='(' and list_s[i]!=')':
#                         used[i] = True
#                         path.append(list_s[i])
#                         continue
#                     if i>0 and used[i-1]==True and list_s[i-1]==list_s[i]:
#                         continue
#
#                     used[i] = True
#                     path.append(list_s[i])
#                     _track_back(depth+1, path, used)
#
#                     # 回复现场
#                     used[i] = False
#                     path.pop()
#         _track_back(0,[],used)
#         return res


# 网友的,感觉思路很棒

class Solution:
    def removeInvalidParentheses(self, string: str) -> List[str]:

        self.res = []

        # 统计右括号不匹配的数量放入r,左括号没有被匹配的数量放入l
        # 这段感觉很不错
        # 太哲学了,,,如果left > 0,那么还有挽回的余地,如果right > 0, 那么就没有挽回的余地
        # 和做饭一样,盐放少了不怕,怕的是盐放多了(泪目
        left = 0
        right = 0

        for char in string:
            if char == '(':
                left += 1
            elif char == ')':
                if left == 0:
                    right += 1
                else:
                    left -= 1

        # 验证目前的s中左右括号数目是否匹配
        def _isValid(string):
            count = 0
            for char in string:
                if char == '(':
                    count += 1
                if char == ')':
                    count -= 1
                if count < 0:
                    return False  # ())))
            return count == 0

        # 回溯法
        def dfs(string: str, start: int, left: int, right: int):
            # 如果左右括号匹配,添加进结果集
            if left == 0 and right == 0:
                if _isValid(string):
                    self.res.append(string)
                return
            # 如果左右不匹配
            for i in range(start, len(string)):
                # 如果i和前一个相同,那么删哪个结果都一样,故跳过
                if i - 1 >= start and string[i] == string[i - 1]:
                    continue
                # 如果右括号有不匹配的,删去右括号,判断是否匹配
                if right > 0 and string[i] == ')':
                    dfs(string[:i] + string[i+1:], i, left, right-1)
                # 如果左括号有不匹配的,删去左括号,判断是否匹配
                if left > 0 and string[i] == '(':
                    dfs(string[:i] + string[i+1:], i, left-1, right)

        dfs(string, 0, left, right)
        return self.res




if __name__ == '__main__':
    solution = Solution()
    res = solution.removeInvalidParentheses('()())()')
    print(res)


相关文章

  • 301. 删除无效的括号

    【Description】删除最小数量的无效括号,使得输入的字符串有效,返回所有可能的结果。 说明: 输入可能包含...

  • 301. 删除无效的括号

    这道题我个人认为比较经典,里边的思路值得学习一开始我用回溯的思路没搞出来,参考网友的写了一版。。。

  • 301. 删除无效的括号

    解法

  • 【LeetCode】301. 删除无效的括号

    给你一个由若干括号和字母组成的字符串 s ,删除最小数量的无效括号,使得输入的字符串有效。 返回所有可能的结果。答...

  • 删除无效的括号

    题目描述:删除最小数量的无效括号,使得输入的字符串有效,返回所有可能的结果。说明: 输入可能包含了除 ( 和 ) ...

  • 删除无效的括号

    来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/remove...

  • 力扣 301 删除无效的括号

    题意:给定一个字符串找出删除最少非法字符串的所有组合 思路: 遍历括号,找出合法的括号个数 利用递归,遍历每一个子...

  • 移除无效的括号

    题目: 给你一个由 '('、')' 和小写字母组成的字符串 s。你需要从字符串中删除最少数目的 '(' 或者 ')...

  • AFNetworking.framework Command /

    尝试解决方法: clean项目,重跑,无效 DerivedData删除,重跑,无效 删除钥匙串重复证书,重跑,无效...

  • Android studio 清除无效资源,无效引用,无效代码

    删除无效资源删除无效资源 @源地址:http://blog.csdn.net/byszy/article/deta...

网友评论

      本文标题:301. 删除无效的括号

      本文链接:https://www.haomeiwen.com/subject/zxzgthtx.html