921. 使括号有效的最少添加
思路1: 模拟
一个介绍过很多次的做法 : 将「有效括号问题」转化为「分值有效性」的数学判定。
使用 score 代指处理过程中的得分,将 '(' 记为 +1,将 ')' 记为 -1。
一个有效的括号应当在整个过程中不出现负数,因此一旦 score 出现负数,我们需要马上增加 ( 来确保合法性;当整个 s 处理完后,还需要添加 socre 等同的 ) 来确保合法性。
Go代码如下:
func minAddToMakeValid(s string) int {
score, ans := 0,0
for _, v := range s {
if v == '(' {
score += 1
} else {
score -= 1
}
if score < 0 {
score = 0
ans += 1
}
}
return ans + score
}
思路2:栈
遇到一个左括号就入站,遇到一个右括号且满足一定条件就出站,最后统计栈的长度就是所需要的数。
Go代码如下:
func minAddToMakeValid(s string) int {
stack := []rune{}
for _, c := range s {
if c == ')' && len(stack) > 0 && stack[len(stack)-1] == '(' {
stack = stack[:len(stack)-1]
} else if c == '(' || c == ')' {
stack = append(stack, c)
}
}
return len(stack)
}
func minAddToMakeValid(s string) int {
stk := []rune{}
for _, c := range s {
if c == ')' && len(stk) > 0 && stk[len(stk)-1] == '(' {
stk = stk[:len(stk)-1]
} else {
stk = append(stk, c)
}
}
return len(stk)
}
好好好。