//给定一个由 '(' 和 ')' 括号组成的字符串 S，我们需要添加最少的括号（ '(' 或是 ')'，可以在任何位置），以使得到的括号字符串有效。 
//
// 从形式上讲，只有满足下面几点之一，括号字符串才是有效的： 
//
// 
// 它是一个空字符串，或者 
// 它可以被写成 AB （A 与 B 连接）, 其中 A 和 B 都是有效字符串，或者 
// 它可以被写作 (A)，其中 A 是有效字符串。 
// 
//
// 给定一个括号字符串，返回为使结果字符串有效而必须添加的最少括号数。 
//
// 
//
// 示例 1： 
//
// 输入："())"
//输出：1
// 
//
// 示例 2： 
//
// 输入："((("
//输出：3
// 
//
// 示例 3： 
//
// 输入："()"
//输出：0
// 
//
// 示例 4： 
//
// 输入："()))(("
//输出：4 
//
// 
//
// 提示： 
//
// 
// S.length <= 1000 
// S 只包含 '(' 和 ')' 字符。 
// 
//
// 
// Related Topics 栈 贪心算法 
// 👍 84 👎 0

package leetcode.editor.cn;

import java.util.Stack;

//921:使括号有效的最少添加
public class MinimumAddToMakeParenthesesValid {
    public static void main(String[] args) {
        //测试代码
        Solution solution = new MinimumAddToMakeParenthesesValid().new Solution();
    }

    //力扣代码
    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        public int minAddToMakeValid(String S) {
            int length = S.length();
            if (length == 0) {
                return 0;
            }
            int num = 0;
            Stack<Character> stack = new Stack<>();
            for (char ch : S.toCharArray()) {
                if (ch == ')') {
                    if (stack.isEmpty()) {
                        num++;
                    } else {
                        stack.pop();
                    }
                } else {
                    stack.push(ch);
                }
            }
            while (!stack.isEmpty()) {
                num++;
                stack.pop();
            }
            return num;
        }
    }
//leetcode submit region end(Prohibit modification and deletion)

}