1106. 解析布尔表达式
给你一个以字符串形式表述的 布尔表达式(boolean) expression
,返回该式的运算结果。
有效的表达式需遵循以下约定:
-
"t"
,运算结果为True
-
"f"
,运算结果为False
-
"!(expr)"
,运算过程为对内部表达式expr
进行逻辑非的运算(NOT) -
"&(expr1,expr2,...)"
,运算过程为对 2 个或以上内部表达式expr1, expr2, ...
进行逻辑与的运算(AND) -
"|(expr1,expr2,...)"
,运算过程为对 2 个或以上内部表达式expr1, expr2, ...
进行逻辑或的运算(OR)
示例 1:
输入:expression = "!(f)" 输出:true
示例 2:
输入:expression = "|(f,t)" 输出:true
示例 3:
输入:expression = "&(t,f)" 输出:false
示例 4:
输入:expression = "|(&(t,f,t),!(t))" 输出:false
提示:
-
1 <= expression.length <= 20000
-
expression[i]
由{'(', ')', '&', '|', '!', 't', 'f', ','}
中的字符组成。 -
expression
是以上述形式给出的有效表达式,表示一个布尔值。
做题结果
成功,表达式切水果,关键是学会划分
方法:DFS+栈
1. 如果直接是t,f就返回
2. 否则说明有括号,取第一个负号,然后去掉外层括号
3. 根据括号配对情况,以及逗号进行分割,此处可以使用栈来记录左括号数目,由于栈中只有一种左括号元素,可使用计数代替栈
4. 根据外层符号进行链接处理,由于与操作有遇到false再进行与操作是false的情况,可根据此判断提前返回; 或操作 true 在进行火,还是true, 也可提前返回
class Solution {
public boolean parseBoolExpr(String expression) {
if(expression.startsWith("t")) return true;
if(expression.startsWith("f")) return false;
char first = expression.charAt(0);
String item = expression.substring(2,expression.length()-1);
List<String> sub = split(item);
if(first=='!'){
return !(parseBoolExpr(sub.get(0)));
}else if(first=='&'){
boolean ans = true;
for(int i = 0; i < sub.size()&&ans; i++){
ans = ans && parseBoolExpr(sub.get(i));
}
return ans;
}
boolean ans = false;
for(int i = 0; i < sub.size()&&!ans; i++){
ans = ans || parseBoolExpr(sub.get(i));
}
return ans;
}
private List<String> split(String str){
int n = str.length();
int j = 0;
int left = 0;
List<String> ans = new ArrayList<>();
for(int i = 0; i < n; i++){
char c = str.charAt(i);
if(c=='(') ++left;
else if(c==')')--left;
if(left == 0 && (c==')' || c=='t' || c=='f')){
ans.add(str.substring(j,i+1));
j = i+2;
}
}
return ans;
}
}