持续创作,加速成长!这是我参与「掘金日新计划 · 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;
}
}