刷题的日常-使括号有效的最少添加

108 阅读2分钟

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

刷题的日常-2022年10月4号

一天一题,保持脑子清爽

使括号有效的最少添加

来自leetcode的 921 题,题意如下:

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

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

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

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

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

示例1:

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

示例2:

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

理解题意

我们可以从题意中提取的条件如下:

  • 题目给出一个字符串,是由括号组成的
  • 给出的括号不一定规范
  • 要求我们补全这个括号的内容,返回最小补全次数

做题思路

从用例其实可以看出,如果出现"()"这样的字符串,可以直接削去,剩下的字符串继续这个削去的规则,最后剩下的字符串长度就是我们需要的结果。步骤如下:

  • 开辟一个栈进行模拟
  • 因为最少有一个字符,所以我们可以吧第一个字符放入栈里
  • 如果出现')'字符,则看下前面的字符是不是'(',如果是,指针回退
  • 如果不是,需要的补全长度加一
  • 返回最终剩下的长度

代码实现

代码实现如下,因为只需要遍历一次,所以时间复杂度为O(n):

public class Solution {
    public int minAddToMakeValid(String s) {
        char[] stack = new char[s.length()];
        int idx = 0, len = 1;
        stack[idx] = s.charAt(idx++);
        while (idx < s.length()) {
            char c = s.charAt(idx++);
            if (c == ')' && len > 0 && stack[len - 1] == '(') {
                len--;
                continue;
            }
            stack[len++] = c;
        }
        return len;
    }
}

image.png