使括号有效的最少添加

140 阅读2分钟

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

🎈算法并不一定都是很难的题目,也有很多只是一些代码技巧,多进行一些算法题目的练习,可以帮助我们开阔解题思路,提升我们的逻辑思维能力,也可以将一些算法思维结合到业务代码的编写思考中。简而言之,平时进行的算法习题练习带给我们的好处一定是不少的,所以让我们一起来养成算法练习的习惯。今天练习的题目是一道中等难度的题目 -> 使括号有效的最少添加

题目描述

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

它是一个空字符串,或者 它可以被写成 AB (A 与 B 连接), 其中 A 和 B 都是有效字符串,或者 它可以被写作 (A),其中 A 是有效字符串。 给定一个括号字符串 s ,移动N次,你就可以在字符串的任何位置插入一个括号。

例如,如果 s = "()))" ,你可以插入一个开始括号为 "(()))" 或结束括号为 "())))" 。 返回 为使结果字符串 s 有效而必须添加的最少括号数。

示例 1:

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

示例 2:

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

提示:

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

思路分析

首先我们要先理解一下题目的意思,题目会给我们一个字符串,字符串中只包含字符(),我们需要计算将这个字符串变成有效地字符串需要进行多少步的修改,简单来说就是要是字符串的括号满足闭合规则,那么我们可以思考一下什么情况下的括号是没有闭合的。

  • 1、当前位置前面的左括号数量少于右括号数量

这个时候多出来的右括号是无法找到匹配的括号的,所以我们需要在他前面添加左括号与其匹配。

  • 2、末尾左括号数量多于右括号数量

这个时候末尾的左括号无法完全匹配完,这时我们需要在后边添加右括号与其匹配。

所以我们可以这样做:

  • 1、统计左右括号的数量

left统计左括号数量,right统计右括号数量,res为所需要添加括号的数量。

let left = 0,right = 0,res = 0;
for(let i = 0; i < s.length; i++){
    if(s[i] == '(') left++;
    if(s[i] == ')') right++;
    ……
}
  • 2、判断右括号是否多于左括号

如果当前位置前面的左括号数量少于右括号数量,这个时候多出来的右括号是无法找到匹配的括号的,所以我们需要在他前面添加左括号与其匹配。

if(right > left){
    res ++;
    right = 0,left = 0;
}
  • 3、计算末尾需要加上的右括号数量 末尾的左括号无法完全匹配完的话,这时我们需要在后边添加右括号与其匹配。
return res + Math.abs(right - left);

完整AC代码如下:

AC代码

/**
 * @param {string} s
 * @return {number}
 */
var minAddToMakeValid = function(s) {
    let left = 0,right = 0,res = 0;
    for(let i = 0; i < s.length; i++){
        if(s[i] == '(') left++;
        if(s[i] == ')') right++;
        if(right > left){
            res ++;
            right = 0,left = 0;
        }
    }
    return res + Math.abs(right - left);
};

说在后面

🎉这里是JYeontu,喜欢算法,GDCPC打过卡;热爱羽毛球,大运会打过酱油。毕业一年,两年前端开发经验,目前担任H5前端开发,算法业余爱好者,有空会刷刷算法题,平时喜欢打打羽毛球🏸 ,也喜欢写些东西,既为自己记录📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解🙇,写错的地方望指出,定会认真改进😊,在此谢谢大家的支持,我们下文再见🙌。