2.2 Ternary Expression Parser 439
Description
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 digits0-9
,?
,:
,T
andF
(T
andF
represent True and False respectively).
Note:
- The length of the given string is ≤ 10000.
- Each number will contain only one digit.
- The conditional expressions group right-to-left (as usual in most languages).
- The condition will always be either
T
orF
. That is, the condition will never be a digit. - The result of the expression will always evaluate to either a digit
0-9
,T
orF
.
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"
Hint
DFS + stack
Method
Firstly, expression problem seems like the calculator, maybe we can use stack
Secondly, each ternary expression including a mini ternary expression just like a recursion
so we can use dfs by stack
since it group from right to left
we can start from right
each time we meet problem sign we do a mini calculate
T?F?4:5:6
do first cal -> F ? 4 : 5 -> 5
T?5:6
do second cal-> 5
Time & Space
O(n)
Code
public String parseTernary(String expression) {
if (expression == null || expression.length() == 0){
return "";
}
Deque<Character> stack = new LinkedList<Character>();
for (int i = expression.length() - 1; i >= 0; i--){
char c = expression.charAt(i);
if (!stack.isEmpty() && stack.peek() == '?'){
stack.pop();
char first = stack.pop();
stack.pop();
char second = stack.pop();
if (c == 'T'){
stack.push(first);
} else {
stack.push(second);
}
} else {
stack.push(c);
}
}
return stack.peek() + "";
}