题意

当且仅当一个括号内的字符串是有效的。

它是空字符串。 它可以写成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
}