开启掘金成长之旅!这是我参与「掘金日新计划 · 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(); //返回最少添加数
}
}
提交结果: