美文网首页
439. Ternary Expression Parser

439. Ternary Expression Parser

作者: kevinscake | 来源:发表于2016-11-10 03:18 被阅读0次

方法一:O(N^2)

思路非常的直观:如何将问题减而治之(Decrease and Conquer)

  1. 找到outter most的表达式
  2. 找到两个sub express,子问题用递归求解

关键问题:

  1. 既然是递归,那么base是?
    1. 当没有question mark,直接返回
    2. 当只有1个question mark,可以直接判断
  2. 如何找到outter most的表达式?
    利用题目的信息“The conditional expressions group right-to-left”,因此最左边的question mark即为outter most
  3. 如何找到对应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)

相关文章

网友评论

      本文标题:439. Ternary Expression Parser

      本文链接:https://www.haomeiwen.com/subject/eiwtpttx.html