Veamos un problema con strings + una posible solución. ¿Se te ocurre algún algoritmo diferente? 🧠 (pista: los hay).

Fuente: leetcode.com

Enunciado

Click aquí para una versión accesible de la infografía (apta para lectores electrónicos)

Dada una cadena S y un carácter C, retornar un arreglo de enteros representando la distancia más corta desde cada carácter en la cadena hasta una ocurrencia del carácter C.

Ejemplo 1:

Entrada: “algoritmo”, ‘o’

Salida: [3, 2, 1, 0, 1, 2, 2, 1, 0]

Ejemplo 2:

Entrada: “abcdefga”, ‘a’

Salida: [0, 1, 2, 3, 3, 2, 1, 0]

Precondiciones:

La longitud de S está en [1, 1000].

C es un único carácter.

C se encuentra en S.

Todas las letras en S y C son minúsculas.


 

Algoritmo

Click aquí para una versión accesible de la infografía (apta para lectores electrónicos)

Solución intuitiva:

Por cada índice S[i], se intenta encontrar la distancia al siguiente carácter C yendo hacia la iziquierda y yendo hacia la derecha. La respuesta será el menor de esos dos valores.

Algoritmo:

Yendo de izquierda a derecha, guardar el índice prev del último carácter C encontrado. Así, la respuesta será i - prev.

Yendo de derecha a izquierda, guardar el índice prev del último carácter C encontrado. Así, la respuesta será prev - i.

Tomar el menor de estos dos valores para obtener el resultado final.

Complejidad:

De tiempo: O(N), donde N es la longitud de S. Se pasa dos veces por toda la cadena.

De espacio: O(N), el tamaño de la respuesta.


 

Código

Click aquí para una versión accesible de la infografía (apta para lectores electrónicos)

Solución en Python:

def distanciaMasCorta(S, C):
    prev = float('-inf')
    ans = []
    for i, x in enumerate(S):
        if x == C:
            prev = i
        ans.append(i - prev)
    prev = float('inf')
    for i in range(len(S) - 1, -1, -1):
        if S[i] == C:
            prev = i
        ans[i] = min(ans[i], prev - i)
    return ans

Solución en Java:

public int[] distanciaMasCorta(String S, char C) {
	int N = S.length();
	int[] ans = new int[N];
	int prev = -(S.length()+1);

	for (int i = 0; i < N; ++i) {
		if (S.charAt(i) == C)
			prev = i;
		ans[i] = i - prev;
	}

	prev = S.length()+1;
	for (int i = N-1; i >= 0; --i) {
		if (S.charAt(i) == C)
			prev = i;
		ans[i] = Math.min(ans[i], prev - i);
	}

	return ans;
}


 


💻 Versión Python ejecutable


💻 Versión Java ejecutable