Parsing A Boolean Expression

HardStringStackRecursion

Solution

export function parseBoolExpr(expression: string): boolean {
  const stack: string[] = [];
  for (const char of expression) {
    if (char === ')') {
      const exprs = new Set<string>();
      while (stack[stack.length - 1] !== '(') {
        exprs.add(stack.pop()!);
      }
      stack.pop();
      const operator = stack.pop()!;
      stack.push(evaluateExpr(exprs, operator) ? 't' : 'f');
    } else if (char !== ',') {
      stack.push(char);
    }
  }
 
  return stack.pop() === 't' ? true : false;
}
 
function evaluateExpr(exprs: Set<string>, operator: string) {
  if (operator === '&') {
    return [...exprs].every((e) => e === 't');
  }
  if (operator === '|') {
    return [...exprs].some((e) => e === 't');
  }
  return !exprs.has('t');
}

Complexity

  • Time: O(N)
  • Space: O(N)