持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第6天,点击查看活动详情
前言
今天的题目为中等,但是其实偏简单,只需要根据题目的意思进行模拟就好了。
每日一题
今天的题目是 921. 使括号有效的最少添加,难度为中等
-
只有满足下面几点之一,括号字符串才是有效的:
-
它是一个空字符串,或者
-
它可以被写成 AB (A 与 B 连接), 其中 A 和 B 都是有效字符串,或者
-
它可以被写作 (A),其中 A 是有效字符串。
-
给定一个括号字符串 s ,移动N次,你就可以在字符串的任何位置插入一个括号。
-
例如,如果 s = "()))" ,你可以插入一个开始括号为 "(()))" 或结束括号为 "())))" 。
-
返回 为使结果字符串 s 有效而必须添加的最少括号数。
示例 1:
输入:s = "())"
输出:1
示例 2:
输入:s = "((("
输出:3
提示:
- 1 <= s.length <= 1000
- s 只包含 '(' 和 ')' 字符。
题解
栈
题目的意思需要去匹配字符串中的括号能否成对,那么首先考虑到利用栈来解决,通过栈来记录下字符串中每一个括号的个数,遇到了能够消除掉的括号就将两个括号都一同出栈,无法消除就入栈,最后栈中剩下的括号数量,就是题目需要的数量。
拿例一中的 "())" 来进行讲解,第一个括号为 左括号,直接入栈,第二个括号为右括号,栈中的最后一个括号刚好为左括号,能够和右括号组合,一起出栈,字符串最后一位为右括号,此时栈中已经没有相匹配的左括号,所以直接入栈。
所以按照上面的的思路,碰到了左括号就直接入栈,右括号就去判断当前栈内的最后一个是什么。
function minAddToMakeValid(s) {
let arr = []
if (!s[0]) return 0
arr.push(s[0])
for (let i = 1; i < s.length; i++) {
if (s[i] == ')') {
if (arr[arr.length - 1] == '(') {
arr.pop()
} else {
arr.push(')')
}
}
if (s[i] == '(') {
arr.push('(')
}
}
return arr.length
};