Leetcode 1541. Minimum Insertions to Balance a Parentheses String (括号问题好题)

  1. Minimum Insertions to Balance a Parentheses String
    Medium

Given a parentheses string s containing only the characters '(' and ')'. A parentheses string is balanced if:

Any left parenthesis '(' must have a corresponding two consecutive right parenthesis '))'.

Left parenthesis '(' must go before the corresponding two consecutive right parenthesis '))'.

In other words, we treat '(' as an opening parenthesis and '))' as a closing parenthesis.

For example, "())", "())(())))" and "(())())))" are balanced, ")()", "()))" and "(()))" are not balanced.

You can insert the characters '(' and ')' at any position of the string to balance it if needed.

Return the minimum number of insertions needed to make s balanced.

Example 1:

Input: s = "(()))"

Output: 1

Explanation: The second '(' has two matching '))', but the first '(' has only ')' matching. We need to add one more ')' at the end of the string to be "(())))" which is balanced.

Example 2:

Input: s = "())"

Output: 0

Explanation: The string is already balanced.

Example 3:

Input: s = "))())("

Output: 3

Explanation: Add '(' to match the first '))', Add '))' to match the last '('.

Constraints:

1 <= s.length <= 105

s consists of '(' and ')' only.

解法1:这题其实不简单。关键是来了左括号时,当前所需有括号数目是偶数的处理。

注意:

  1. 当来了'('括号时,
    a. 如果当前所需右括号数目rightNeeded是偶数,那没什么大关系,再把rightNeeded +2就可以。比如输入"(())",rightNeeded=2,那再来一个'(',rightNeeded=4。
    b. 如果当前所需右括号数目rightNeeded是奇数,那么比较麻烦,我们必须在新来左括号'('的时候消掉一个多余的右括号,这样,rightNeeded就是偶数,跟a的情况一样。怎么消掉呢?那我们再增加左括号,消掉一个右括号就可以了。
    比如输入"(()",rightNeeded=3。再来一个'(',此时我们必须在这个新来的'('前面加上一个'(',即"((()(",这样,leftNeeded++, rightNeeded--,就可以把rightNeeded变成偶数了。

举例:

"(()))(()))()())))"

cpp 复制代码
class Solution {
public:
    int minInsertions(string s) {
        int n = s.size();
        int leftNeeded = 0, rightNeeded = 0;
        for (auto c : s) {
            if (c == '(') {
                if (rightNeeded & 0x1) {
                    leftNeeded++;
                    rightNeeded--;
                }
                rightNeeded += 2;

            } else {
                rightNeeded--;
                if (rightNeeded == -1) {
                    leftNeeded++;
                    rightNeeded = 1;
                }               
            }
        }               
        return leftNeeded + rightNeeded;
    }
};
相关推荐
小智老师PMP1 分钟前
PMP6月考前最后1个月冲刺攻略
算法·软件工程·求职招聘·产品经理·敏捷流程
MATLAB代码顾问5 分钟前
哈里斯鹰优化算法(HHO)原理与Python实现
python·算法·机器学习
何陋轩7 分钟前
Spring AI + RAG实战:打造企业级智能问答系统
后端·算法·设计模式
叼烟扛炮17 分钟前
C++第五讲:内存管理
c++·算法·面试·内存管理
Tisfy20 分钟前
LeetCode 3629.通过质数传送到达终点的最少跳跃次数:埃式筛+BFS
算法·leetcode·宽度优先·质数·埃式筛
Hello.Reader25 分钟前
算法基础(九)——循环不变式如何证明一个算法是正确的
java·开发语言·算法
wuweijianlove28 分钟前
算法稳定性分析中的输入扰动建模的技术7
算法
MATLAB代码顾问35 分钟前
粒子群优化算法(PSO)原理与Python高级实现
开发语言·python·算法
Epiphany.55637 分钟前
连通块的遍历
c++·算法·蓝桥杯
alxraves1 小时前
超声诊断图像的关键算法概述
算法·安全·健康医疗·制造·信号处理