栈-N921-使括号有效的最少添加

题目

  • 概述:给定一个只包含括号的字符串,问至少添加多少个括号能使该字符串正确闭合,正确闭合的条件如下:
  1. 左括号必须与相同类型的右括号闭合
  2. 所有括号都按正确的顺序闭合
  3. 空字符串也算正确闭合

括号可以添加到任意位置

思路

  • 由于每次判断是否闭合都要看前面的一个括号,可以考虑用栈来实现

  • 规律

  1. 如果字符串的最后一个括号是右括号,且该字符串中含有左括号,则该右括号必定能正确闭合;如果没有左括号,在右括号适当位置添加一个左括号,该右括号也能正确闭合
  2. 如果字符串的最后一个括号是左括号,则在它右边添加一个右括号就能正确闭合
  • 具体做法
  1. 将字符串中的括号依次放入栈中,并统计左括号的数量,记为leftSum

  2. 记需要添加括号的数量为addSum = 0,看栈顶元素:

    (1) 右括号&&leftSum>0 => --addSum; --leftSum

    (2) 右括号&&leftSum<=0 => ++addSum; leftSum不变

    (3) 左括号 => ++addSum; --leftSum

    (3) 左括号&&左括号未被匹配过 => ++addSum; --leftSum

    (4) 左括号&&左括号被匹配过 => ++addSum; leftSum不变

判断左括号有无匹配过可以记一个变量为storedLeft,在(1)处++storedLeft,如果storedLeft>0则表示左括号被匹配过,反之则没有被匹配过

(1)处--addSum是为了抵消(3)处++addSum从而保证此次正确闭合不会使addSum发生变化

  1. 将栈顶元素出栈然后再执行2直到栈为空

代码

class Solution {
    public int minAddToMakeValid(String S) {
        if (S == null || S.length() == 0) {
            return 0;
        }
        
        LinkedList<Character> stack = new LinkedList<>();
        // add storedLeft to avoid repeat minus leftSum in such case "()()"
        int addSum = 0, leftSum = 0, storedLeft = 0;
        for (char c : S.toCharArray()) {
            if (c == '(') {
                ++leftSum;
            }
            stack.push(c);
        }
        
        while (!stack.isEmpty()) {
            switch (stack.pop()) {
                case '(':
                    if (storedLeft > 0) {
                        --storedLeft;
                    } else {
                        --leftSum;
                    }
                    ++addSum;
                    break;
                case ')':
                    if (leftSum > 0) {
                        --leftSum;
                        ++storedLeft;
                        --addSum;
                    } else {
                        ++addSum;
                    }
                    break;
            }
        }
        
        return addSum;
    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,658评论 0 5
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,621评论 0 4
  • 前言 最先接触编程的知识是在大学里面,大学里面学了一些基础的知识,c语言,java语言,单片机的汇编语言等;大学毕...
    oceanfive阅读 3,329评论 0 7
  • Unicode®标准附录#9 UNICODE双向算法#### 摘要#### 本附件是一份关于字符定位的规范,主要描...
    Eriice阅读 5,165评论 0 6
  • 我又开始寻找自我,以至于觉得之前的改变都被推翻。每次只有在难受的时候才会这样深刻的考虑人生,依稀记得有人对我说,每...
    清水李阅读 425评论 0 1

友情链接更多精彩内容