题目地址:
https://www.lintcode.com/problem/1908/description
给出一个布尔表达式
s
s
s,以字符串形式给出,求其值。如果该表达式不合法,返回"error"
。注意"and"
运算符比"or"
高级。题目保证该表达式里只含"and"
和"or"
运算。
思路是单调栈。但是这里由于只有两个运算,而且and更优先,所以遇到or的时候可以直接进栈,遇到and的时候可以立即将栈顶与后面的布尔值做与运算再push进栈。最后将栈内元素全部or一遍即得结果。当然一开始需要看一下表达式是否合法,先将 s s s对空格做split,如果首尾是运算符则非法,如果中间有连续的两个运算符或者连续两个布尔值也非法。代码如下:
import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.Deque;
import java.util.List;
public class Solution {
/**
* @param expression: a string that representing an expression
* @return: the result of the expression
*/
public String evaluation(String expression) {
// write your code here
List<String> list = Arrays.asList("true", "false");
String[] strs = expression.split(" ");
if (!list.contains(strs[0]) || !list.contains(strs[strs.length - 1])) {
return "error";
}
for (int i = 1; i < strs.length; i++) {
if (list.contains(strs[i]) == list.contains(strs[i - 1])) {
return "error";
}
}
Deque<Boolean> stk = new ArrayDeque<>();
for (int i = 0; i < strs.length; i++) {
if (list.contains(strs[i])) {
stk.push("true".equals(strs[i]));
} else {
if ("and".equals(strs[i])) {
stk.push(stk.pop() && "true".equals(strs[i + 1]));
i++;
}
}
}
while (!stk.isEmpty()) {
if (stk.pop()) {
return "true";
}
}
return "false";
}
}
时空复杂度 O ( l s ) O(l_s) O(ls)。