持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情
只有满足下面几点之一,括号字符串才是有效的:
- 它是一个空字符串,或者
- 它可以被写成
AB(A与B连接), 其中A和B都是有效字符串,或者 - 它可以被写作
(A),其中A是有效字符串。
给定一个括号字符串 s ,移动N次,你就可以在字符串的任何位置插入一个括号。
- 例如,如果
s = "()))",你可以插入一个开始括号为"(()))"或结束括号为"())))"。
返回 为使结果字符串 s 有效而必须添加的最少括号数。
示例 1:
输入: s = "())"
输出: 1
示例 2:
输入: s = "((("
输出: 3
提示:
1 <= s.length <= 1000s只包含'('和')'字符。
思路
- 方法一:先定义计数器
res和一个栈stack,遍历字符串,如果当前字符是(则入栈,如果是),分两种情况:当前栈不为空,则入栈,如果当前栈为空,说明没有和他匹配的前括号(,res加一。遍历完成后,如果栈stack不为空,则栈里的都是没有匹配到后空格)。返回值为res + stack.length。 - 方法二:和方法一思路一样,只是把栈
stack换成空格计数器count。遍历字符串,如果当前字符是(,则count加一,如果是),分为两种情况,如果count > 0,count减一,如果count = 0,res加一,遍历完成后,如果count > 0,则字符串里有count个(没有匹配到)。返回值res + count。
解题
解法一
/**
* @param {string} s
* @return {number}
*/
var minAddToMakeValid = function (s) {
let res = 0;
let stack = [];
for (let i = 0; i < s.length; i++) {
if (s[i] === "(") {
stack.push('(')
} else if (!stack.pop()) {
res++;
}
}
return stack.length + res;
};
解法二
/**
* @param {string} s
* @return {number}
*/
var minAddToMakeValid = function (s) {
let res = 0;
let count = 0;
for (let i = 0; i < s.length; i++) {
if (s[i] === "(") {
count++;
} else if (count > 0) {
count--;
} else {
res++;
}
}
return count + res;
};