当且仅当一个括号内的字符串是有效的。
它是空字符串。 它可以写成AB(A与B相连接),其中A和B是有效的字符串,或者 可以写成(A),其中A是一个有效的字符串。 给你一个括号内的字符串s,在一个动作中,你可以在该字符串的任何位置插入一个括号。
例如,如果s="())",你可以插入一个开头小括号为"(()) "或一个结尾小括号为"())))"。 返回使s有效所需的最小移动数。
这道题首先关注的就是(, )的数量差异问题。要让括号配对,那左右括号的数量是一定相等的。
但是需要注意一个情况))((
.如果只计算左右括号的差异,那么将会是0,但是实际我们需要4步。
所以这里采用栈模拟,发现()
弹出,最后看栈中剩余的括号的数量,就是我们要补充的。
func minAddToMakeValid(s string) int {
stack := make([]byte, len(s))
i := -1
for _, b := range []byte(s) {
if i == -1 || !(b == ')' && stack[i] == '(') {
i++
stack[i] = b
continue
}
i--
}
return i + 1
}