Minimum Add to Make Parentheses Valid

medium string stack greedy

Problem

Given a parentheses string, return the minimum number of '(' or ')' insertions needed to make it balanced.

Inputs = "())"
Output1
One '(' inserted at the front (or any valid position) fixes it.

def minAddToMakeValid(s):
    opens = 0  # unmatched '('
    adds = 0   # ')' we need to prepend
    for c in s:
        if c == '(':
            opens += 1
        else:
            if opens > 0: opens -= 1
            else: adds += 1
    return opens + adds
function minAddToMakeValid(s) {
  let opens = 0, adds = 0;
  for (const c of s) {
    if (c === '(') opens++;
    else {
      if (opens) opens--;
      else adds++;
    }
  }
  return opens + adds;
}
class Solution {
    public int minAddToMakeValid(String s) {
        int opens = 0, adds = 0;
        for (char c : s.toCharArray()) {
            if (c == '(') opens++;
            else {
                if (opens > 0) opens--;
                else adds++;
            }
        }
        return opens + adds;
    }
}
int minAddToMakeValid(string s) {
    int opens = 0, adds = 0;
    for (char c : s) {
        if (c == '(') opens++;
        else {
            if (opens > 0) opens--;
            else adds++;
        }
    }
    return opens + adds;
}
Time: O(n) Space: O(1)