Given a string expression representing arbitrarily nested ternary expressions, evaluate the expression, and return the result of it.
You can always assume that the given expression is valid and only contains digits, '?', ':', 'T', and 'F' where 'T' is true and 'F' is false. All the numbers in the expression are one-digit numbers (i.e., in the range [0, 9]).
The conditional expressions group right-to-left (as usual in most languages), and the result of the expression will always evaluate to either a digit, 'T' or 'F'.
Example 1:
Input: expression = "T?2:3"
Output: "2"Explanation: If true, then result is 2; otherwise result is 3.
Example 2:
Input: expression = "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 : 4)" --> "4"
or "(F ? 1 : (T ? 4 : 5))" --> "(T ? 4 : 5)" --> "4"
Example 3:
Input: expression = "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 ? F : 3)" --> "F"
"(T ? (T ? F : 5) : 3)" --> "(T ? F : 5)" --> "F"
Constraints:
5 <= expression.length <= 10⁴expression consists of digits, 'T', 'F', '?', and ':'.expression is a valid ternary expression and that each number is a one-digit number.class Solution:
def parseTernary(self, expression: str) -> str:
# Checks if the string s is a valid atomic expression
def isValidAtomic(s):
return s[0] in 'TF' and s[1] == '?' and s[2] in 'TF0123456789'\
and s[3] == ':' and s[4] in 'TF0123456789'
# Returns the value of the atomic expression
def solveAtomic(s):
return s[2] if s[0] == 'T' else s[4]
# Reduce expression until we are left with a single character
while len(expression) != 1:
j = len(expression) - 1
while not isValidAtomic(expression[j-4:j+1]):
j -= 1
expression = expression[:j-4] + \
solveAtomic(expression[j-4:j+1]) + expression[j+1:]
# Return the final character
return expressionWhere is the length of
expression
class Solution:
def parseTernary(self, expression: str) -> str:
# Reduce expression until we are left with a single character
while len(expression) != 1:
questionMarkIndex = len(expression) - 1
while expression[questionMarkIndex] != '?':
questionMarkIndex -= 1
# Find the value of the expression.
if expression[questionMarkIndex - 1] == 'T':
value = expression[questionMarkIndex + 1]
else:
value = expression[questionMarkIndex + 3]
# Replace the expression with the value
expression = expression[:questionMarkIndex - 1] + value\
+ expression[questionMarkIndex + 4:]
# Return the final character
return expressionWhere is the length of
expression
class Solution:
def parseTernary(self, expression: str) -> str:
# Initialize a stack
stack = []
# Traverse the expression from right to left
for char in expression[::-1]:
# If stack top is ?, then replace next four characters
# with E1 or E2 depending on the value of B
if stack and stack[-1] == '?':
stack.pop()
onTrue = stack.pop()
stack.pop()
onFalse = stack.pop()
stack.append(onTrue if char == 'T' else onFalse)
# Otherwise, push this character
else:
stack.append(char)
# Return the final character
return stack[0]Where is the length of
expression
class TreeNode:
def __init__(self, val):
self.val = val
self.left = None
self.right = None
class Solution:
def parseTernary(self, expression: str) -> str:
# Global Index to Construct Binary Tree
self.index = 0
root = self.constructTree(expression)
# Parse the binary tree till we reach the leaf node
while root.left and root.right:
if root.val == 'T':
root = root.left
else:
root = root.right
return root.val
def constructTree(self, expression):
# Storing current character of expression
root = TreeNode(expression[self.index])
# If the last character of expression, return
if self.index == len(expression) - 1:
return root
# Check the next character
self.index += 1
if expression[self.index] == '?':
self.index += 1
root.left = self.constructTree(expression)
self.index += 1
root.right = self.constructTree(expression)
return rootWhere is the length of
expression
class Solution:
def parseTernary(self, expression: str) -> str:
# To analyze the expression between two indices
def solve(i, j):
# If expression is a single character, return it
if i == j:
return expression[i]
# Find the index of ?
questionMarkIndex = i
while expression[questionMarkIndex] != '?':
questionMarkIndex += 1
# Find one index after corresponding :
aheadColonIndex = questionMarkIndex + 1
count = 1
while count != 0:
if expression[aheadColonIndex] == '?':
count += 1
elif expression[aheadColonIndex] == ':':
count -= 1
aheadColonIndex += 1
# Check the value of B and recursively solve
if expression[i] == 'T':
return solve(questionMarkIndex + 1, aheadColonIndex - 2)
else:
return solve(aheadColonIndex, j)
# Solve for the entire expression
return solve(0, len(expression) - 1)Where is the length of
expression
class Solution:
def parseTernary(self, expression: str) -> str:
i = 0
while True:
if expression[i] not in 'TF' or i == len(expression) - 1\
or expression[i + 1] == ':':
return expression[i]
if expression[i] == 'T':
i = i + 2
else:
count = 1
i = i + 2
while count != 0:
if expression[i] == ':':
count -= 1
elif expression[i] == '?':
count += 1
i += 1Where is the length of
expression