Leetcode.844. Comparar cadenas con retroceso

844. Comparar cadenas con retroceso

Dadas Sy Tdos cadenas, cuando se ingresan en un editor de texto en blanco, se determina si las dos son iguales y devuelve el resultado. #Representa el carácter de retroceso.

Nota: Si ingresa un carácter de retroceso para texto vacío, el texto permanecerá vacío.

Ejemplo 1:

输入:S = "ab#c", T = "ad#c"
输出:true
解释:S 和 T 都会变成 “ac”。

Ejemplo 2:

输入:S = "ab##", T = "c#d#"
输出:true
解释:S 和 T 都会变成 “”。

Ejemplo 3:

输入:S = "a##c", T = "#a#c"
输出:true
解释:S 和 T 都会变成 “c”。

Ejemplo 4:

输入:S = "a#c", T = "b"
输出:false
解释:S 会变成 “c”,但 T 仍然是 “b”。

rápido:

  • 1 <= S. longitud <= 200
  • 1 <= longitud T. <= 200
  • S y T solo contienen letras minúsculas y el carácter '#'.

Avanzado:

¿Puede utilizar la O(N)complejidad del tiempo y O(1)la complejidad del espacio para resolver este problema?

Método 1: refactorizar la cadena

bool backspaceCompare(char* S, char* T) {
    
    
    return strcmp(build(S), build(T)) == 0;
}

char* build(char* str) {
    
    
    int n = strlen(str), len = 0;
    char* ret = malloc(sizeof(char) * (n + 1));
    for (int i = 0; i < n; i++) {
    
    
        if (str[i] != '#') {
    
    
            ret[len++] = str[i];
        } else if (len > 0) {
    
    
            len--;
        }
    }
    ret[len] = '\0';
    return ret;
}

Método 2: puntero doble

Si un personaje se elimina o no depende solo de si hay algo detrás del personaje #, por lo que podemos recorrer de atrás hacia adelante. De esta manera, se puede determinar inmediatamente si se borra el carácter.

bool backspaceCompare(char* S, char* T) {
    
    
    int i = strlen(S) - 1, j = strlen(T) - 1;
    int skipS = 0, skipT = 0;

    while (i >= 0 || j >= 0) {
    
    
        while (i >= 0) {
    
    
            if (S[i] == '#') {
    
    
                skipS++, i--;
            } else if (skipS > 0) {
    
    
                skipS--, i--;
            } else {
    
    
                break;
            }
        }
        while (j >= 0) {
    
    
            if (T[j] == '#') {
    
    
                skipT++, j--;
            } else if (skipT > 0) {
    
    
                skipT--, j--;
            } else {
    
    
                break;
            }
        }
        if (i >= 0 && j >= 0) {
    
    
            if (S[i] != T[j]) {
    
    
                return false;
            }
        } else {
    
    
            if (i >= 0 || j >= 0) {
    
    
                return false;
            }
        }
        i--, j--;
    }
    return true;
}

Oficial de Leetcode

Supongo que te gusta

Origin blog.csdn.net/e891377/article/details/109154391
Recomendado
Clasificación