[LeetCode]Ternary Expression Parser

题目描述:

LeetCode 439. Ternary Expression Parser

Given a string representing arbitrarily nested ternary expressions, calculate the result of the expression. You can always assume that the given expression is valid and only consists of digits 0-9, ?, :, T and F (T and F represent True and False respectively).

Note:

  1. The length of the given string is ≤ 10000.
  2. Each number will contain only one digit.
  3. The conditional expressions group right-to-left (as usual in most languages).
  4. The condition will always be either T or F. That is, the condition will never be a digit.
  5. The result of the expression will always evaluate to either a digit 0-9, T or F.

Example 1:

Input: "T?2:3"

Output: "2"

Explanation: If true, then result is 2; otherwise result is 3.

Example 2:

Input: "F?1:T?4:5"

Output: "4"

Explanation: The conditional expressions group right-to-left. Using parenthesis, it is read/evaluated as:

             "(F ? 1 : (T ? 4 : 5))"                   "(F ? 1 : (T ? 4 : 5))"
          -> "(F ? 1 : 4)"                 or       -> "(T ? 4 : 5)"
          -> "4"                                    -> "4"

Example 3:

Input: "T?T?F:5:3"

Output: "F"

Explanation: The conditional expressions group right-to-left. Using parenthesis, it is read/evaluated as:

             "(T ? (T ? F : 5) : 3)"                   "(T ? (T ? F : 5) : 3)"
          -> "(T ? F : 3)"                 or       -> "(T ? F : 5)"
          -> "F"                                    -> "F"

题目大意:

给定一个字符串表示一个任意嵌套的三目表达式,计算表达式的结果。你可以假设表达式一定有效,并且只包含数字0-9,?, :, T 和 F (T 和 F 分别表示 True 和 False)

注意:

  1. 字符串长度 ≤ 10000
  2. 每个数字只有一位
  3. 条件表达式从右向左分组 (与大多数编程语言保持一致)
  4. 条件永远是 T 或者 F。 也就是说,条件永远不会是数字
  5. 表达式的结果可以是 0-9, T 或者 F

解题思路:

栈(Stack)数据结构

循环直到栈中元素为1并且表达式为空:

取栈顶的5个元素,判断是否为一个可以解析的表达式。若是,则解析后压栈

否则从右向左将expression中的字符压入栈stack

Python代码:

class Solution(object):
    def parseTernary(self, expression):
        """
        :type expression: str
        :rtype: str
        """
        stack = []
        expr = list(expression)
        while len(stack) > 1 or expr:
            tail = stack[-5:]
            if len(tail) == 5 and tail[3] == '?' and tail[1] == ':':
                tail = tail[2] if tail[4] == 'T' else tail[0]
                stack = stack[:-5] + [tail]
            else:
                stack.append(expr.pop())
        return stack[0] if stack else None

 

本文链接:http://bookshadow.com/weblog/2016/10/23/leetcode-ternary-expression-parser/
请尊重作者的劳动成果,转载请注明出处!书影博客保留对文章的所有权利。

如果您喜欢这篇博文,欢迎您捐赠书影博客: ,查看支付宝二维码