Evaluate a boolean expression represented as string
Given a string consisting of only 0, 1, A, B, C where
A = AND
B = OR
C = XOR
Calculate the value of the string assuming no order of precedence and evaluation is done from left to right.
Constraints – The length of string will be odd. It will always be a valid string.
Example, 1AA0 will not be given as an input.
Examples:
Input : 1A0B1 Output : 1 1 AND 0 OR 1 = 1 Input : 1C1B1B0A0 Output : 0
Source : Microsoft online round for internship 2017
The idea is to traverse all operands by jumping a character after every iteration. For current operand str[i], check values of str[i+1] and str[i+2], accordingly decide the value of current subexpression.
Implementation:
C++
// C++ program to evaluate value of an expression. #include <bits/stdc++.h> using namespace std; int evaluateBoolExpr(string s) { int n = s.length(); // Traverse all operands by jumping // a character after every iteration. for ( int i = 0; i < n; i += 2) { // If operator next to current operand // is AND. if (s[i + 1] == 'A' ) { if (s[i + 2] == '0' || s[i] == '0' ) s[i + 2] = '0' ; else s[i + 2] = '1' ; } // If operator next to current operand // is OR. else if (s[i + 1] == 'B' ) { if (s[i + 2] == '1' || s[i] == '1' ) s[i + 2] = '1' ; else s[i + 2] = '0' ; } // If operator next to current operand // is XOR (Assuming a valid input) else { if (s[i + 2] == s[i]) s[i + 2] = '0' ; else s[i + 2] = '1' ; } } return s[n - 1] - '0' ; } // Driver code int main() { string s = "1C1B1B0A0" ; cout << evaluateBoolExpr(s); return 0; } |
Java
// Java program to evaluate value of an expression. public class Evaluate_BoolExp { // Evaluates boolean expression // and returns the result static int evaluateBoolExpr(StringBuffer s) { int n = s.length(); // Traverse all operands by jumping // a character after every iteration. for ( int i = 0 ; i < n; i += 2 ) { // If operator next to current operand // is AND. if ( i + 1 < n && i + 2 < n) { if (s.charAt(i + 1 ) == 'A' ) { if (s.charAt(i + 2 ) == '0' || s.charAt(i) == 0 ) s.setCharAt(i + 2 , '0' ); else s.setCharAt(i + 2 , '1' ); } // If operator next to current operand // is OR. else if ((i + 1 ) < n && s.charAt(i + 1 ) == 'B' ) { if (s.charAt(i + 2 ) == '1' || s.charAt(i) == '1' ) s.setCharAt(i + 2 , '1' ); else s.setCharAt(i + 2 , '0' ); } // If operator next to current operand // is XOR (Assuming a valid input) else { if (s.charAt(i + 2 ) == s.charAt(i)) s.setCharAt(i + 2 , '0' ); else s.setCharAt(i + 2 , '1' ); } } } return s.charAt(n - 1 ) - '0' ; } // Driver code public static void main(String[] args) { String s = "1C1B1B0A0" ; StringBuffer sb = new StringBuffer(s); System.out.println(evaluateBoolExpr(sb)); } } // This code is contributed by Sumit Ghosh |
Python3
# Python3 program to evaluate value # of an expression. import math as mt def evaluateBoolExpr(s): n = len (s) # Traverse all operands by jumping # a character after every iteration. for i in range ( 0 , n - 2 , 2 ): # If operator next to current # operand is AND.''' if (s[i + 1 ] = = "A" ): if (s[i + 2 ] = = "0" or s[i] = = "0" ): s[i + 2 ] = "0" else : s[i + 2 ] = "1" # If operator next to current # operand is OR. else if (s[i + 1 ] = = "B" ): if (s[i + 2 ] = = "1" or s[i] = = "1" ): s[i + 2 ] = "1" else : s[i + 2 ] = "0" # If operator next to current operand # is XOR (Assuming a valid input) else : if (s[i + 2 ] = = s[i]): s[i + 2 ] = "0" else : s[i + 2 ] = "1" return ord (s[n - 1 ]) - ord ( "0" ) # Driver code s = "1C1B1B0A0" string = [s[i] for i in range ( len (s))] print (evaluateBoolExpr(string)) # This code is contributed # by mohit kumar 29 |
C#
// C# program to evaluate value // of an expression. using System; using System.Text; class GFG { // Evaluates boolean expression // and returns the result public static int evaluateBoolExpr(StringBuilder s) { int n = s.Length; // Traverse all operands by jumping // a character after every iteration. for ( int i = 0; i < n; i += 2) { // If operator next to current // operand is AND. if (i + 1 < n && i + 2 < n) { if (s[i + 1] == 'A' ) { if (s[i + 2] == '0' || s[i] == 0) { s[i + 2] = '0' ; } else { s[i + 2] = '1' ; } } // If operator next to current // operand is OR. else if ((i + 1) < n && s[i + 1] == 'B' ) { if (s[i + 2] == '1' || s[i] == '1' ) { s[i + 2] = '1' ; } else { s[i + 2] = '0' ; } } // If operator next to current operand // is XOR (Assuming a valid input) else { if (s[i + 2] == s[i]) { s[i + 2] = '0' ; } else { s[i + 2] = '1' ; } } } } return s[n - 1] - '0' ; } // Driver code public static void Main( string [] args) { string s = "1C1B1B0A0" ; StringBuilder sb = new StringBuilder(s); Console.WriteLine(evaluateBoolExpr(sb)); } } // This code is contributed by Shrikant13 |
PHP
<?php // PHP program to evaluate value // of an expression. function evaluateBoolExpr( $s ) { $n = strlen ( $s ); // Traverse all operands by jumping // a character after every iteration. for ( $i = 0; $i < $n ; $i += 2) { // If operator next to current operand // is AND. if (( $i + 1) < $n && $s [ $i + 1] == 'A' ) { if ( $s [ $i + 2] == '0' || $s [ $i ] == '0' ) $s [ $i + 2] = '0' ; else $s [ $i + 2] = '1' ; } // If operator next to current operand // is OR. else if (( $i + 1) < $n && $s [ $i + 1] == 'B' ) { if ( $s [ $i + 2] == '1' || $s [ $i ] == '1' ) $s [ $i + 2] = '1' ; else $s [ $i + 2] = '0' ; } // If operator next to current operand // is XOR (Assuming a valid input) else { if (( $i + 2) < $n && $s [ $i + 2] == $s [ $i ]) $s [ $i + 2] = '0' ; else $s [ $i + 2] = '1' ; } } return $s [ $n - 1] - '0' ; } // Driver code $s = "1C1B1B0A0" ; echo evaluateBoolExpr( $s ); // This code is contributed // by Akanksha Rai |
Javascript
<script> // Javascript program to evaluate // value of an expression. // Evaluates boolean expression // and returns the result function evaluateBoolExpr(s) { let n = s.length; // Traverse all operands by jumping // a character after every iteration. for (let i = 0; i < n; i += 2) { // If operator next to current // operand is AND. if (i + 1 < n && i + 2 < n) { if (s[i + 1] == 'A' ) { if (s[i + 2] == '0' || s[i] == 0) { s[i + 2] = '0' ; } else { s[i + 2] = '1' ; } } // If operator next to current // operand is OR. else if ((i + 1) < n && s[i + 1] == 'B' ) { if (s[i + 2] == '1' || s[i] == '1' ) { s[i + 2] = '1' ; } else { s[i + 2] = '0' ; } } // If operator next to current operand // is XOR (Assuming a valid input) else { if (s[i + 2] == s[i]) { s[i + 2] = '0' ; } else { s[i + 2] = '1' ; } } } } return (s[n - 1].charCodeAt() - '0' .charCodeAt()); } // Driver code let s = "1C1B1B0A0" ; let sb = s.split( '' ); document.write(evaluateBoolExpr(sb) + "</br>" ); // This code is contributed by rameshtravel07 </script> |
0
Time Complexity: O(n)
Auxiliary Space: O(n)
This article is contributed by Ayushi Jain. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Please Login to comment...