Parsing A Boolean Expression
Return the result of evaluating a given boolean expression
, represented as a string.
An expression can either be:
"t"
, evaluating toTrue
;"f"
, evaluating toFalse
;"!(expr)"
, evaluating to the logical NOT of the inner expressionexpr
;"&(expr1,expr2,...)"
, evaluating to the logical AND of 2 or more inner expressionsexpr1, expr2, ...
;"|(expr1,expr2,...)"
, evaluating to the logical OR of 2 or more inner expressionsexpr1, expr2, ...
Example 1:
Input: expression = "!(f)"
Output: true
Example 2:
Input: expression = "|(f,t)"
Output: true
Example 3:
Input: expression = "&(t,f)"
Output: false
Example 4:
Input: expression = "|(&(t,f,t),!(t))"
Output: false
Constraints:
1 <= expression.length <= 20000
expression[i]
consists of characters in{'(', ')', '&', '|', '!', 't', 'f', ','}
.expression
is a valid expression representing a boolean, as given in the description.
Solutions
🧠 Cpp
class Solution
{
// IN: string with coma separated BOOL expressions
// OUT: list of corresponding BOOL values
list<bool> deduceBoolList(string exprs)
{
list<bool> res;
const char *c_exprs = exprs.c_str();
do
{
//if we are on coma. step over it
if(*c_exprs == ',')
c_exprs++;
//if we have an operator with argumets
if(c_exprs[1] == '(')
{
//to find the end, we must count every ()
const char *exp_end = c_exprs+2;
size_t active_parentheses_num = 1;
while(active_parentheses_num)
{
exp_end++;
if(*exp_end == '(')
active_parentheses_num++;
if(*exp_end == ')')
active_parentheses_num--;
}
//when end is found form string with whole expression
string exp(c_exprs, exp_end-c_exprs+1);
res.push_back(parseBoolExpr(exp));
c_exprs = exp_end+1;
}
else
{
string exp(1,*c_exprs);
res.push_back(parseBoolExpr(exp));
}
}
while(c_exprs = strchr(c_exprs, ','));
return res;
}
using fbbb = function<bool(bool,bool)>;
public:
bool parseBoolExpr(string expression)
{
if(expression == "f")
return false;
if(expression == "t")
return true;
//3 chars: !()
string in_parentheses = expression.substr(2, expression.size() - 3);
//check for !
if(expression.front() == '!')
return !parseBoolExpr(in_parentheses);
//else we have & or |
list<bool> values = deduceBoolList(in_parentheses);
auto operation = expression.front() == '&' ?
(fbbb)bit_and<bool>() :
bit_or<bool>();
return std::accumulate(values.begin(), values.end(), values.front(),
operation);
}
};
Last updated
Was this helpful?