[
string
parser
recursion
stack
]
BinarySearch 0423 Parse Boolean Expression
Problem statement
Solution
Similar to BinarySearch 0148 S-Expression Evaluation. Here again create dict of correspondences of brackets d. Then we use part(i) function which will collect either (...) or true, false, or or and. Thene we use dp(i), which will consist of 3 parts: part1, x, part2 or it has only one part1.
Complexity
It is O(n) for time and space.
Code
class Solution:
def solve(self, s):
def corr(s):
stack, d = [], {}
for i, elem in enumerate(s):
if elem == "(":
stack.append(i)
elif elem == ")":
last = stack.pop()
d[last] = i
return d
s = s.replace("true", "1").replace("false", "0")
def op(x, y, o):
if o == "or":
return "1" if x == "1" or y == "1" else "-"
return "1" if x == "1" and y == "1" else "0"
def part(i):
if s[i] == "(":
return (dp(i + 1), d[i] + 1)
else:
j = i
while j + 1 < len(s) and s[j + 1].isalpha(): j += 1
return (s[i: j+1], j + 1)
def dp(i):
part1, idx = part(i)
if idx == len(s): return part1
x, idx = part(idx + 1)
part2, _ = part(idx + 1)
return op(part1, part2, x)
d = corr(s)
return True if dp(0) == "1" else False