439. Ternary Expression Parser

LeetCode medium original: C# #csharp #leetcode #medium #sliding-window #string #tree
El texto de la tarea se traduce del ruso para el idioma seleccionado. El código no cambia.

Дана cadena expression, представляющая произвольно вложенные тернарные выражения, вычислите это выражение и return его результат.

Можно всегда считать, что данное выражение является корректным и содержит только цифры, '?', ':', 'T' и 'F', где 'T' означает истину, а 'F' - ложь. Все числа в выражении являются однозначными числами (т.е. в диапазоне от 0 до 9).

Условные выражения группируются справа налево (как обычно в большинстве языков), и результат выражения всегда будет либо цифрой, либо 'T', либо 'F'.

Ejemplo:

Input: expression = "T?2:3"

Output: "2"

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

C# solución

coincidente/original
public class Solution {
    public string ParseTernary(string expression) {
        bool IsValidAtomic(string s) {
            return (s[0] == 'T' || s[0] == 'F') &&
                   s[1] == '?' &&
                   ("TF0123456789".Contains(s[2])) &&
                   s[3] == ':' &&
                   ("TF0123456789".Contains(s[4]));
        }
        char SolveAtomic(string s) {
            return s[0] == 'T' ? s[2] : s[4];
        }
        while (expression.Length != 1) {
            int j = expression.Length - 1;
            while (!IsValidAtomic(expression.Substring(j-4, 5))) {
                j -= 1;
            }
            expression = expression.Substring(0, j-4) + SolveAtomic(expression.Substring(j-4, 5)) + expression.Substring(j+1);
        }
        return expression;
    }
}

C++ solución

borrador automático, revisar antes de enviar
#include <bits/stdc++.h>
using namespace std;

// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
class Solution {
public:
    public string ParseTernary(string expression) {
        bool IsValidAtomic(string s) {
            return (s[0] == 'T' || s[0] == 'F') &&
                   s[1] == '?' &&
                   ("TF0123456789".Contains(s[2])) &&
                   s[3] == ':' &&
                   ("TF0123456789".Contains(s[4]));
        }
        char SolveAtomic(string s) {
            return s[0] == 'T' ? s[2] : s[4];
        }
        while (expression.size() != 1) {
            int j = expression.size() - 1;
            while (!IsValidAtomic(expression.Substring(j-4, 5))) {
                j -= 1;
            }
            expression = expression.Substring(0, j-4) + SolveAtomic(expression.Substring(j-4, 5)) + expression.Substring(j+1);
        }
        return expression;
    }
}

Java solución

coincidente/original
class Solution {
    public String parseTernary(String expression) {
        boolean isValidAtomic(String s) {
            return s.charAt(0) == 'T' || s.charAt(0) == 'F' &&
                   s.charAt(1) == '?' &&
                   "TF0123456789".indexOf(s.charAt(2)) != -1 &&
                   s.charAt(3) == ':' &&
                   "TF0123456789".indexOf(s.charAt(4)) != -1;
        }

        char solveAtomic(String s) {
            return s.charAt(0) == 'T' ? s.charAt(2) : s.charAt(4);
        }

        while (expression.length() != 1) {
            int j = expression.length() - 1;
            while (!isValidAtomic(expression.substring(j-4, j+1))) {
                j -= 1;
            }
            expression = expression.substring(0, j-4) + solveAtomic(expression.substring(j-4, j+1)) + expression.substring(j+1);
        }

        return expression;
    }
}

JavaScript solución

coincidente/original
var parseTernary = function(expression) {
    const isValidAtomic = (s) => {
        return (s[0] === 'T' || s[0] === 'F') &&
               s[1] === '?' &&
               'TF0123456789'.includes(s[2]) &&
               s[3] === ':' &&
               'TF0123456789'.includes(s[4]);
    };

    const solveAtomic = (s) => {
        return s[0] === 'T' ? s[2] : s[4];
    };

    while (expression.length !== 1) {
        let j = expression.length - 1;
        while (!isValidAtomic(expression.substring(j-4, j+1))) {
            j -= 1;
        }
        expression = expression.substring(0, j-4) + solveAtomic(expression.substring(j-4, j+1)) + expression.substring(j+1);
    }

    return expression;
};

Python solución

coincidente/original
class Solution:
    def parseTernary(self, expression: str) -> str:
        def isValidAtomic(s):
            return s[0] in 'TF' and s[1] == '?' and s[2] in 'TF0123456789' and s[3] == ':' and s[4] in 'TF0123456789'
        
        def solveAtomic(s):
            return s[2] if s[0] == 'T' else s[4]

        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 expression

Go solución

coincidente/original
func parseTernary(expression string) string {
    isValidAtomic := func(s string) bool {
        return (s[0] == 'T' || s[0] == 'F') &&
               s[1] == '?' &&
               (strings.Contains("TF0123456789", string(s[2]))) &&
               s[3] == ':' &&
               (strings.Contains("TF0123456789", string(s[4])))
    }

    solveAtomic := func(s string) byte {
        if s[0] == 'T' {
            return s[2]
        }
        return s[4]
    }

    for len(expression) != 1 {
        j := len(expression) - 1
        for !isValidAtomic(expression[j-4:j+1]) {
            j -= 1
        }
        expression = expression[:j-4] + string(solveAtomic(expression[j-4:j+1])) + expression[j+1:]
    }

    return expression
}

Algorithm

Определите вспомогательную функцию isValidAtomic(s), которая принимает строку s и returns True, если s является допустимым атомарным выражением. В противном случае функция returns False. Функция будет вызываться только с пятисимвольными cadenaми. Если все следующие условия выполнены, функция returns True, иначе - False: s[0] является T или F. s[1] является ?. s[2] является T, F или цифрой от 0 до 9. s[3] является :. s[4] является T, F или цифрой от 0 до 9.

Определите вспомогательную функцию solveAtomic(s), которая принимает строку s и returns значение атомарного выражения. Значение атомарного выражения равно E1, если B - это T, иначе значение равно E2. Функция будет вызываться только с пятисимвольными cadenaми и возвращать один символ:.

Если s[0] является T, функция returns s[2], иначе returns s[4]. В функции parseTernary(expression) уменьшайте выражение до тех пор, пока не останется односимвольная cadena. Инициализируйте j как expression.size() - 1 (это будет самый правый индекс окна). Пока самое правое окно длиной 5 не является допустимым атомарным выражением, уменьшайте j на 1. Когда будет найдено самое правое допустимое атомарное выражение, решите его и уменьшите до одного символа. Замените самое правое допустимое атомарное выражение одним символом, после чего длина выражения уменьшится на 4. В итоге останется односимвольная cadena, которую и return.

😎

Vacantes para esta tarea

Se muestran vacantes activas con etiquetas coincidentes.

Todas las vacantes
Todavía no hay vacantes activas.