Check if a Parentheses String Can Be Valid

MediumStringStackGreedy

Solution

export function canBeValid(s: string, locked: string): boolean {
  return (
    s.length % 2 === 0 && validate(s, locked, '(') && validate(reverse(s), reverse(locked), ')')
  );
}
 
function reverse(s: string): string {
  let reversed = '';
  for (let i = s.length - 1; 0 <= i; i--) {
    reversed += s[i];
  }
  return reversed;
}
 
function validate(s: string, locked: string, open: string): boolean {
  let balanced = 0;
  let unlocked = 0;
  for (let i = 0; i < s.length; i++) {
    if (locked[i] === '1') {
      balanced += s[i] === open ? 1 : -1;
    } else {
      unlocked += 1;
    }
    if (balanced + unlocked < 0) {
      return false;
    }
  }
  return balanced <= unlocked;
}

Complexity

  • Time: O(n)O(n)
  • Space: O(1)O(1)