leetcode刷题记录-921. 使括号有效的最少添加

26 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第6天,点击查看活动详情

前言

今天的题目为中等,但是其实偏简单,只需要根据题目的意思进行模拟就好了。

每日一题

今天的题目是 921. 使括号有效的最少添加,难度为中等

  • 只有满足下面几点之一,括号字符串才是有效的:

  • 它是一个空字符串,或者

  • 它可以被写成 AB (A 与 B 连接), 其中 A 和 B 都是有效字符串,或者

  • 它可以被写作 (A),其中 A 是有效字符串。

  • 给定一个括号字符串 s ,移动N次,你就可以在字符串的任何位置插入一个括号。

  • 例如,如果 s = "()))" ,你可以插入一个开始括号为 "(()))" 或结束括号为 "())))" 。

  • 返回 为使结果字符串 s 有效而必须添加的最少括号数。

 

示例 1:

输入:s = "())"
输出:1

示例 2:

输入:s = "((("
输出:3

 

提示:

  • 1 <= s.length <= 1000
  • s 只包含 '(' 和 ')' 字符。

题解

题目的意思需要去匹配字符串中的括号能否成对,那么首先考虑到利用栈来解决,通过栈来记录下字符串中每一个括号的个数,遇到了能够消除掉的括号就将两个括号都一同出栈,无法消除就入栈,最后栈中剩下的括号数量,就是题目需要的数量。

拿例一中的 "())" 来进行讲解,第一个括号为 左括号,直接入栈,第二个括号为右括号,栈中的最后一个括号刚好为左括号,能够和右括号组合,一起出栈,字符串最后一位为右括号,此时栈中已经没有相匹配的左括号,所以直接入栈。

所以按照上面的的思路,碰到了左括号就直接入栈,右括号就去判断当前栈内的最后一个是什么。

function minAddToMakeValid(s) {
    let arr = []
    if (!s[0]) return 0
    arr.push(s[0])
    for (let i = 1; i < s.length; i++) {
        if (s[i] == ')') {
            if (arr[arr.length - 1] == '(') {
                arr.pop()
            } else {
                arr.push(')')
            }
        }
        if (s[i] == '(') {
            arr.push('(')
        }
    }
    return arr.length
};

image.png