LeetCode 439. Ternary Expression Parser
原题链接在这里:https://leetcode.com/problems/ternary-expression-parser/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 digits 0-9
, ?
, :
, T
and F
(T
and F
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"
题解:
从后往前扫输入的string. 把char 放入stack中. 当扫过了'?', 就知道需要开始判断了.
从stack中弹出两个数,判断后的数放回stack中.
Time Complexity: O(n). n = expression.length();
Space: O(n).
AC Java:
1 class Solution { 2 public String parseTernary(String expression) { 3 if(expression == null || expression.length() == 0){ 4 return expression; 5 } 6 7 Stack<Character> stk = new Stack<Character>(); 8 for(int i = expression.length()-1; i>=0; i--){ 9 char c = expression.charAt(i); 10 if(!stk.isEmpty() && stk.peek()=='?'){ 11 stk.pop(); // '?' 12 char first = stk.pop(); 13 stk.pop(); // ':' 14 char second = stk.pop(); 15 16 if(c == 'T'){ 17 stk.push(first); 18 }else{ 19 stk.push(second); 20 } 21 }else{ 22 stk.push(c); 23 } 24 } 25 26 return String.valueOf(stk.peek()); 27 } 28 }
Track the first string and second string separated by the corresponding " : ".
Based on the true or false, continue DFS on the corresponding string.
Time Complexity: O(n^2). n = expression.length().
Space: O(n).
AC Java:
1 class Solution { 2 public String parseTernary(String expression) { 3 if(expression.length() == 1){ 4 return expression; 5 } 6 7 int indexQuestion = expression.indexOf("?"); 8 boolean flag = expression.charAt(0) == 'T' ? true : false; 9 10 int count = 0; 11 int start = indexQuestion+1; 12 while(expression.charAt(start) != ':' || count != 0){ 13 if(expression.charAt(start) == '?'){ 14 count++; 15 }else if(expression.charAt(start) == ':'){ 16 count--; 17 } 18 19 start++; 20 } 21 22 String first = expression.substring(indexQuestion+1, start); 23 String second = expression.substring(start+1); 24 return parseTernary(flag ? first : second); 25 } 26 }