LeetCode 301. Remove Invalid Parentheses

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

v2-680e21b67163abc22f7214b03a02d832_1440w.jpg

Description



Remove the minimum number of invalid parentheses in order to make the input string valid. Return all possible results.


Note: The input string may contain letters other than the parentheses ( and ).


Example 1:


Input: "()())()"
Output: ["()()()", "(())()"]


Example 2:


Input: "(a)())()"
Output: ["(a)()()", "(a())()"]

Example 3:


Input: ")("
Output: [""]


描述



删除最小数量的无效括号,使得输入的字符串有效,返回所有可能的结果。

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

示例 1:


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


示例 2:


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


示例 3:


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


思路



  • 深度优先搜索.
  • 对于一个合法括号,在任意一个不是最后的位置,当前位置(包括)前面的左括号个数一定是大于等于右括号个数,此为我们判断一个字符串是否是合法字符串的条件.
  • 我们首先获取需要去掉多少个左括号和去掉多少个右括号,然后我我们使用深度优先搜索,递归的先去左括号,再去右括号.


# -*- coding: utf-8 -*-
# @Author:             何睿
# @Create Date:        2019-02-10 15:47:49
# @Last Modified by:   何睿
# @Last Modified time: 2019-02-10 17:57:38
class Solution:
    def removeInvalidParentheses(self, s: 'str') -> 'List[str]':
        # 如果为空,返回空字符串
        if not s: return [""]
        # 统计非法的左右括号的个数
        left, right = 0, 0
        for _s in s:
            # 如果是左括号,left自增一次
            if _s == "(": left += 1
            # 如果没有非法的左括号,并且当前是右括号,right自增一次
            if left == 0 and _s == ")":
                right += 1
            # 否则如果当前是右括号,我们让当前的右括号和一个左括号匹配
            # left自减一次
            elif _s == ")":
                left -= 1
        res = []
        self.__dfs(s, 0, left, right, res)
        return res
    def __dfs(self, s, start, left, right, res):
        # 递归结束条件
        if not left and not right and self.__valid(s):
            res.append(s)
            return
        for i in range(start, len(s)):
            # 避免重复
            if i != start and s[i] == s[i - 1]: continue
            if s[i] == "(" or s[i] == ")":
                # 删除字符
                current = s[0:i] + s[i + 1:]
                # 先删除右括号
                if right > 0: self.__dfs(current, i, left, right - 1, res)
                # 再删除左括号
                elif left > 0: self.__dfs(current, i, left - 1, right, res)
        return
    def __valid(self, s):
        # 统计有效的括号个数
        # 只要不到最后一个位置,左括号个数一定大于右括号的个数
        # 最后一个位置左右括号的个数相等
        count = 0
        for _s in s:
            # 遇到左括号,count加一
            if _s == "(": count += 1
            # 遇到右括号,count减一
            if _s == ")": count -= 1
            # 如果count小于0,说明当前位置一定没有足够的左括号
            # 和右括号进行匹配,返回False
            if count < 0: return False
        return count == 0


源代码文件在这里.


目录
相关文章
LeetCode 241. Different Ways to Add Parentheses
给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果。你需要给出所有可能的组合的结果。有效的运算符号包含 +, - 以及 * 。
84 0
LeetCode 241. Different Ways to Add Parentheses
Leetcode-Easy 20. Valid Parentheses
Leetcode-Easy 20. Valid Parentheses
110 0
Leetcode-Easy 20. Valid Parentheses
LeetCode 20:有效的括号 Valid Parentheses
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。 Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the input string is valid. 有效字符串需满足: 左括号必须用相同类型的右括号闭合。
764 0
|
Java
[LeetCode] Valid Parentheses 验证括号是否有效闭合
链接:https://leetcode.com/problems/valid-parentheses/#/description难度:Easy题目:20.
1014 0
LeetCode - 20. Valid Parentheses
20. Valid Parentheses  Problem's Link  ---------------------------------------------------------------------------- Mean:  给定一个括号序列,检查括号是否按顺序匹配.
880 0
|
3月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
63 6
|
4月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
125 2
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
43 1