【Java每日一题 21-1】LeetCode - 921. 使括号有效的最少添加

246 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第 天,点击查看活动详情


题目、921. 使括号有效的最少添加

原题链接:921. 使括号有效的最少添加

题目描述

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

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

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

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

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

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

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

/

示例 1:

输入:s = "())"

输出:1

/

示例 2:

输入:s = "((("

输出:3

解题思路

题目把要求讲述地很细致了,我们可以简单地理解为:要让字符串中没有多余的单边括号,我们最少要添加多少次对应的单边括号呢?

一开始我觉得十分简单,既然要让括号都对应起来,那就让左半边括号的数量等于右半边括号的数量不就行了?

于是我就很自信地遍历字符串的每一个字符:

当遇到左括号‘(’,就记录左括号数量left++;

当遇到右括号‘)’,就记录左括号数量right++;

最后返回差值....

结果提交结果是:

在这里插入图片描述 在这里插入图片描述

我忽略了一类重要的情况:那就是当左右括号顺序是错开的,上面的思路就完全错误啦。 比如:") (",需要返回的就不是差值0,而是2.

这么一来我们就需要另外想办法了,但是问题不大,思路很快就有啦,那就是利用栈结构来判断:

当遇到左括号'(',我们就将左括号入栈,等待对应的右括号')';

当遇到右括号')',我们就要分为两种情况...

①栈中没有元素,也就是栈长度为0时,我们记录右括号')'的数量right++

②当栈中存在元素左括号(,我们将栈顶元素弹出,代表两个括号对应,抵消了。

当我们遍历完整个字符串,也就知道了最少需要添加多少个括号使得所有括号有效了:

我们需要right数量个的左括号'(' 和 栈长度数量个的右括号')' 栈记作 dq,则最少需要 添加right + dq.size()个括号

提交代码

class Solution {
    public int minAddToMakeValid(String s) {
        char[] ch = s.toCharArray();        //字符串转化为字符数组
        int right = 0;                      //用于记录单独的右括号个数

        //创建栈,用于记录单独的左括号个数
        Deque<Character> dq = new LinkedList<>();
        for(char a : ch){            //遍历每一个字符
            if(a == '(')             //左括号入栈
            dq.push(a);
            if(a == ')'){            //遇到右括号
                if(dq.size() == 0){  //栈空,right++
                    ++right;
                }else{               //栈中有对应的左括号
                    dq.pop();        //栈顶弹出,左右括号对应抵消
                }
            }
        }

        return right + dq.size();   //返回最少添加数
    }
}

提交结果

在这里插入图片描述