题目链接:点击跳转
题目意思很简单让你去判断与或非布尔表达式的结果,我们可以看布尔表达式看成一棵树,需要我们解决的是从最底层的嵌套布尔表达式产生的结果不断向上的结果,如图:
既然他是一棵树且我需要从叶结点往上,肯定能看出来直接用DFS遍历树不就好了吗,接下来要解决的问题就是怎么区分他的每个结点:
t、r
则我们直接返回结果。&、|
布尔表达式中存在多个结点(内部表达式),每个结点(内部表达式)用,
分割,需要注意我们不能直接用,
来区分,因为可能存在嵌套的子树(内部表达式)那表达式怎么区分呢?
lcnt,rcnt
分别表示左括号数量和右括号数量
func parseBoolExpr(s string) bool {
if s[0] == 't' {
return true
} else if s[0] == 'f' {
return false
} else if s[0] == '!' {
if parseBoolExpr(s[2:]) {
return false
} else {
return true
}
} else if s[0] == '&' {
l, r, lcnt, rcnt, f := 2, 2, 1, 0, 1
for lcnt != rcnt && r < len(s) {
if s[r] == ',' && lcnt-1 == rcnt {
if !parseBoolExpr(s[l:r]) {
f = 0
}
l = r + 1
} else if s[r] == '(' {
lcnt++
} else if s[r] == ')' {
rcnt++
if lcnt == rcnt {
if !parseBoolExpr(s[l:r]) {
f = 0
}
}
}
r++
}
if f == 1 {
return true
} else {
return false
}
} else if s[0] == '|' {
l, r, lcnt, rcnt, f := 2, 2, 1, 0, 0
for lcnt != rcnt && r < len(s) {
if s[r] == ',' && lcnt-1 == rcnt {
if parseBoolExpr(s[l:r]) {
f = 1
}
l = r + 1
} else if s[r] == '(' {
lcnt++
} else if s[r] == ')' {
rcnt++
if lcnt == rcnt {
if parseBoolExpr(s[l:r]) {
f = 1
}
}
}
r++
}
if f == 1 {
return true
} else {
return false
}
}
return true
}