ได้นิพจน์บูลีนในรูปแบบสตริง ประเมินค่า True/False รูปแบบ: "t" (True), "f" (False), "!(expr)" (NOT), "&(expr1,expr2,...)" (AND), "|(expr1,expr2,...)" (OR)
ตัวอย่าง
"|(!(t),&(t,f,t))" → !(t) = False, &(t,f,t) = False, |(False,False) = False
ขั้นตอนการแก้ปัญหา (Recursive Descent Parser)
- ฟังก์ชัน
solve(e, i)ประเมินนิพจน์ตั้งแต่ดัชนีiคืน(value, next_index) - Base Case:
't'→(True, i+1),'f'→(False, i+1) - Operator: อ่าน
op(!, &, |) ข้าม'(' - วนอ่าน Sub-expressions (ขั่นด้วย
',') จนเจอ')'เรียกsolveซ้อน เก็บผลใน Stack - ประเมินตาม Operator:
&= all(),|= any(),!= not stack[0]
การติดตั้งใน Python
class Solution:
def parseBoolExpr(self, expression):
val, _ = self._parse(expression, 0)
return val
def _parse(self, e, i):
if e[i] == 't':
return True, i + 1
if e[i] == 'f':
return False, i + 1
op = e[i]
i += 2 # skip op and '('
stack = []
while e[i] != ')':
if e[i] == ',':
i += 1
continue
val, i = self._parse(e, i)
stack.append(val)
if op == '&':
return all(stack), i + 1
if op == '|':
return any(stack), i + 1
return not stack[0], i + 1 # op == '!'
ob = Solution()
print(ob.parseBoolExpr("|(!(t),&(t,f,t))")) # False
อินพุต / เอาต์พุต
Input: "|(!(t),&(t,f,t))" Output: False