Minimum Insertions to Balance a Parentheses String

medium string stack greedy

Problem

A string is balanced if every '(' must be followed by '))'. Given a string of '(' and ')', return the minimum number of insertions needed to make it balanced.

Inputs = "(()))"
Output1
Insert one ')' to obtain "(())))" — every '(' is followed by '))'.

def min_insertions(s):
    ans = need = 0
    i, n = 0, len(s)
    while i < n:
        if s[i] == '(':
            need += 2
            if need % 2:        # odd → insert one ')'
                ans += 1; need -= 1
            i += 1
        else:
            if need == 0:       # extra ')': insert '('
                ans += 1; need = 1
            need -= 1
            i += 1
    return ans + need
function minInsertions(s) {
  let ans = 0, need = 0;
  for (let i = 0; i < s.length; i++) {
    if (s[i] === '(') {
      need += 2;
      if (need % 2) { ans++; need--; }
    } else {
      if (need === 0) { ans++; need = 1; }
      need--;
    }
  }
  return ans + need;
}
class Solution {
    public int minInsertions(String s) {
        int ans = 0, need = 0;
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == '(') {
                need += 2;
                if (need % 2 != 0) { ans++; need--; }
            } else {
                if (need == 0) { ans++; need = 1; }
                need--;
            }
        }
        return ans + need;
    }
}
int minInsertions(string s) {
    int ans = 0, need = 0;
    for (char c : s) {
        if (c == '(') {
            need += 2;
            if (need % 2) { ans++; need--; }
        } else {
            if (need == 0) { ans++; need = 1; }
            need--;
        }
    }
    return ans + need;
}
Time: O(n) Space: O(1)