25. Boolean Parenthesization
The problem can be found at the following link: Question Link
Problem Description
Given a boolean expression s consisting of:
Operands:
'T'→ True'F'→ False
Operators:
'&'→ Boolean AND'|'→ Boolean OR'^'→ Boolean XOR
Count the number of ways we can parenthesize the expression such that it evaluates to True.
Examples
Example 1:
Input:
Output:
Explanation:
The expression evaluates to True in 4 ways:
((T | T) & (F ^ T)) → (T | T) → T, (F ^ T) → T, T & T = T ✅(T | (T & (F ^ T))) → (F ^ T) → T, (T & T) → T, T | T = T ✅(((T | T) & F) ^ T) → (T | T) → T, (T & F) → F, F ^ T = T ✅(T | ((T & F) ^ T)) → (T & F) → F, (F ^ T) → T, T | T = T ✅
Example 2:
Input:
Output:
Explanation:
The expression evaluates to True in 2 ways:
((T^F)|F)(T^(F|F))
Constraints:
$(1 \leq |s| \leq 100)$
My Approach: Dynamic Programming (Bottom-Up Table)
The problem follows optimal substructure and overlapping subproblems, making Dynamic Programming (DP) the most efficient approach.
We use a bottom-up DP approach where we maintain two 2D DP tables:
T[i][j]→ Number of ways to parenthesizes[i:j]to get True.F[i][j]→ Number of ways to parenthesizes[i:j]to get False.
Algorithm Steps:
Initialize the DP tables:
If
s[i] == 'T', setT[i][i] = 1(since a singleTis alwaysTrue).If
s[i] == 'F', setF[i][i] = 1(since a singleFis alwaysFalse).
Fill the DP tables using a bottom-up approach:
Iterate over subexpressions of increasing length (
l), from 2 to n.For each subexpression
s[i:j], check each operators[k](wherekis an odd index).Compute
T[i][j]andF[i][j]using previously computed DP values.
Update DP values based on the operator
s[k]:If
s[k] == '&'(AND operator):T[i][j] += lt * rt(both left and right must be True).F[i][j] += lt * rf + lf * rt + lf * rf(any case where at least one is False).
If
s[k] == '|'(OR operator):T[i][j] += lt * rt + lt * rf + lf * rt(only both False make it False).F[i][j] += lf * rf.
If
s[k] == '^'(XOR operator):T[i][j] += lt * rf + lf * rt(one True, one False).F[i][j] += lt * rt + lf * rf(both True or both False).
Return
T[0][n-1], which gives the total ways to evaluatestoTrue.
Time and Auxiliary Space Complexity
Expected Time Complexity: O(N³), as we process all partitions
(i, k, j)for each segment ofs.Expected Auxiliary Space Complexity: O(N²), for storing
TandFDP tables.
Code (C++)
Code (Java)
Code (Python)
Contribution and Support
For discussions, questions, or doubts related to this solution, feel free to connect on LinkedIn: Any Questions. Let’s make this learning journey more collaborative!
⭐ If you find this helpful, please give this repository a star! ⭐
📍Visitor Count
Last updated