2024-10-20 Daily Challenge

Today I have done leetcode's October LeetCoding Challenge with cpp.

October LeetCoding Challenge 20

Description

Parsing A Boolean Expression

A boolean expression is an expression that evaluates to either true or false. It can be in one of the following shapes:

  • 't' that evaluates to true.
  • 'f' that evaluates to false.
  • '!(subExpr)' that evaluates to the logical NOT of the inner expression subExpr.
  • '&(subExpr1, subExpr2, ..., subExprn)' that evaluates to the logical AND of the inner expressions subExpr1, subExpr2, ..., subExprn where n >= 1.
  • '|(subExpr1, subExpr2, ..., subExprn)' that evaluates to the logical OR of the inner expressions subExpr1, subExpr2, ..., subExprn where n >= 1.

Given a string expression that represents a boolean expression, return the evaluation of that expression.

It is guaranteed that the given expression is valid and follows the given rules.

 

Example 1:

Input: expression = "&(|(f))"
Output: false
Explanation: 
First, evaluate |(f) --> f. The expression is now "&(f)".
Then, evaluate &(f) --> f. The expression is now "f".
Finally, return false.

Example 2:

Input: expression = "|(f,f,f,t)"
Output: true
Explanation: The evaluation of (false OR false OR false OR true) is true.

Example 3:

Input: expression = "!(&(f,t))"
Output: true
Explanation: 
First, evaluate &(f,t) --> (false AND true) --> false --> f. The expression is now "!(f)".
Then, evaluate !(f) --> NOT false --> true. We return true.

 

Constraints:

  • 1 <= expression.length <= 2 * 104
  • expression[i] is one following characters: '(', ')', '&', '|', '!', 't', 'f', and ','.

Solution

class Solution {
  bool helper(const string &e, int &pos) {
    if(e[pos] == 't' || e[pos] == 'f') {
      pos += 1;
      return e[pos - 1] == 't';
    }
    if(e[pos] == '!') {
      pos += 2;
      bool result = !helper(e, pos);
      pos += 1;
      return result;
    }
    if(e[pos] == '&') {
      pos += 2;
      bool result = helper(e, pos);
      while(e[pos] == ',') {
        pos += 1;
        result &= helper(e, pos);
      }
      pos += 1;
      return result;
    }
    if(e[pos] == '|') {
      pos += 2;
      bool result = helper(e, pos);
      while(e[pos] == ',') {
        pos += 1;
        result |= helper(e, pos);
      }
      pos += 1;
      return result;
    }
    return false;
  }
public:
  bool parseBoolExpr(string expression) {
    int pos = 0;
    return helper(expression, pos);
  }
};