解题思路
只有遇到‘|’ 或 ‘&’需要进一步用函数进行判断。
整体逻辑并不难,只是比较麻烦,将代码ctrl+c v调试一下就懂了
代码
/**
* @param {string} expression
* @return {boolean}
*/
var parseBoolExpr = function (str) {
if (str.length === 1) { //判断“t” “r”
switch (str) {
case "t":
return true
case "f":
return false
}
}
let subExp = str.slice(2, str.length - 1) //判断最外层表达式
switch (str[0]) {
case "!":
return !parseBoolExpr(subExp)
case "&":
return parseAnd(subExp)
case "|":
return pasrseOr(subExp)
}
}
function parseAnd(exp) {
let res = true
let stack = 0
let start = 0
for (let i = 0; i < exp.length; i++) {
if (exp[i] == '(') { stack++ }
if (exp[i] == ')') { stack-- }
if (exp[i] == ',' && stack == 0) {
//recursion
res = res && parseBoolExpr(exp.slice(start, i))
start = i + 1
if (!res) { return false }
}
}
res = res && parseBoolExpr(exp.slice(start))
//没有“false”
return res
}
function pasrseOr(exp) {
//result置为 false 如有一个符号为true就返回true
let res = false
let stack = 0
let start = 0
for (let i = 0; i < exp.length; i++) {
if (exp[i] == "(") { stack++ }
if (exp[i] == ")") { stack-- }
if (exp[i] == "," && stack == 0) {
res = res || parseBoolExpr(exp.slice(start, i))
start = i + 1
if(res) {
return true
}
}
}
//判断后续表达式 如果都未出现true则返回false
res = res || parseBoolExpr(exp.slice(start))
return res
}