0
点赞
收藏
分享

微信扫一扫

1106. 解析布尔表达式 DFS


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;
}

}

举报

相关推荐

0 条评论