leetcode - 1249. Minimum Remove to Make Valid Parentheses

Description

Given a string s of '(' , ')' and lowercase English characters.

Your task is to remove the minimum number of parentheses ( '(' or ')', in any positions ) so that the resulting parentheses string is valid and return any valid string.

Formally, a parentheses string is valid if and only if:

复制代码
It is the empty string, contains only lowercase characters, or
It can be written as AB (A concatenated with B), where A and B are valid strings, or
It can be written as (A), where A is a valid string.

Example 1:

复制代码
Input: s = "lee(t(c)o)de)"
Output: "lee(t(c)o)de"
Explanation: "lee(t(co)de)" , "lee(t(c)ode)" would also be accepted.

Example 2:

复制代码
Input: s = "a)b(c)d"
Output: "ab(c)d"

Example 3:

复制代码
Input: s = "))(("
Output: ""
Explanation: An empty string is also valid.

Constraints:

复制代码
1 <= s.length <= 10^5
s[i] is either'(' , ')', or lowercase English letter.

Solution

List

Go through the string from left to right, use a left_cnt to keep track of how many ( we have visited, and decrease when there's a ), discard redundant ) during this process.

Go through the string again, this time from right to left, use a right_cnt to keep track of how may ) we have, and decrease when there's a (, discard ( this time.

Time complexity: o ( n ) o(n) o(n)

Space complexity: o ( n ) o(n) o(n)

Stack

Use a stack to store all the (, and pop when there's a ), at the end, all the remaining (s are those we need to discard.

Time complexity: o ( n ) o(n) o(n)

Space complexity: o ( n ) o(n) o(n)

Code

List

python3 复制代码
class Solution:
    def minRemoveToMakeValid(self, s: str) -> str:
        left_cnt = 0
        res = []
        for i in range(len(s)):
            if s[i] not in ('(', ')'):
                res += s[i]
            elif s[i] == '(':
                res += s[i]
                left_cnt += 1
            elif s[i] == ')' and left_cnt > 0:
                res += s[i]
                left_cnt -= 1
        right_cnt = 0
        new_res = ''
        for i in range(len(res) - 1, -1, -1):
            if res[i] not in ('(', ')'):
                new_res += res[i]
            elif res[i] == ')':
                new_res += res[i]
                right_cnt += 1
            elif res[i] == '(' and right_cnt > 0:
                new_res += res[i]
                right_cnt -= 1
        return new_res[::-1]

Stack

python3 复制代码
class Solution:
    def minRemoveToMakeValid(self, s: str) -> str:
        stack = []
        discard = []
        for i in range(len(s)):
            if s[i] == '(':
                stack.append(i)
            elif s[i] == ')':
                if stack:
                    stack.pop()
                else:
                    discard.append(i)
        discard += stack
        res = []
        for i in range(len(s)):
            if i not in discard:
                res.append(s[i])
        return ''.join(res)
相关推荐
Patrick在香港4 分钟前
MCP 的 initialize 握手真的没了?67 行标准库实测 2026-07-28 规范
python·agent·claude·mcp·json-rpc
vx_Biye_Design7 分钟前
springboot角色扮演服务平台65161-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·python·spring·课程设计
追烽少年x10 分钟前
从零构建一个3D点云预览器:Python + PySide6 + pyqtgraph 实战
python·3d
Dream it possible!10 分钟前
蓝桥杯_翻转_C++
c++·算法·蓝桥杯
Ivanqhz10 分钟前
BURG(自底向上重写生成器)
服务器·数据库·人工智能·深度学习·算法
言乐617 分钟前
逻辑回归与利弊
人工智能·算法·机器学习·数据挖掘·逻辑回归
weixin_4404016923 分钟前
质朴的爬虫+数据处理
爬虫·python·数据分析·pandas
估值探索者24 分钟前
【Python量化系统工程实战 #01】数据存储选型 CSVSQLiteMySQL 对比与 SQLite 实战建库
开发语言·jvm·python·sqlite·api接口·数据api接口·股票数据api接口
海绵宝宝转agent26 分钟前
Leetcode100 二叉树的中序遍历
java·算法
计算机毕业编程指导师28 分钟前
计算机毕设答辩技巧:基于Hadoop+Django的公共交通运营数据分析与可视化系统怎么做 源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习
大数据·hadoop·python·spark·毕业设计·课程设计·交通运行