方法一:O(N^2)
思路非常的直观:如何将问题减而治之(Decrease and Conquer)
- 找到outter most的表达式
- 找到两个sub express,子问题用递归求解
关键问题:
- 既然是递归,那么base是?
- 当没有question mark,直接返回
- 当只有1个question mark,可以直接判断
- 如何找到outter most的表达式?
利用题目的信息“The conditional expressions group right-to-left”,因此最左边的question mark即为outter most - 如何找到对应question mark的colon?
pair matching问题,可以用: 1) counting 2) Stack
复杂度:
由于在找配对question mark的时候需要遍历字符串,因此O(N^2)
方法二:优化
思路:类似于表达式评估,利用两个stack,一个conditionStack,另一个operantStack
1. 如果是condition:
conditionStack入栈
2. 如果是colon:
conditionStack出栈
1) 如果condition为T:将指针skip to corresponding colon(即跳过表达式的第二部分)
2) 如果condition为F:operantStack出栈,因为里面的数不再是结果考虑的对象
3. 其他
operant入栈
返回operantStack.peek()
关键问题:
如何跳过表达式的第二部分?利用pair matching的counting
// skip i to corresponding colon position
int cnt = 1;
while (i + 1 < expression.length()) {
if (expression.charAt(i + 1) == ':' && --cnt == 0) break;
else if (expression.charAt(i + 1) == '?') cnt++;
i++;
}
需要注意的是对i + 1进行判断而不是i,因为外层循环会i++
时间复杂度:
由于只需要一次对字符串的一次遍历,因此O(N)