Algoritmo Python para Substring más Largo Sin Repeticiones
Clase 23 de 35 • Curso de Algoritmos Avanzados: Patrones de Arrays y Strings
Contenido del curso
- 3

Patrón de Dos Apuntadores en Algoritmos de Lista
02:56 - 4

Verificación de Orden en Diccionario Alienígena
02:56 - 5

Ordenamiento de Palabras en Idiomas Alienígenas
12:05 - 6
Playground: Verifying Alien Dictionary
00:00 - 7

Ordenación de Palabras en Diccionario Alienígena
15:07 - 8

Combinar Listas Ordenadas en un Array Ascendente
02:11 - 9

Ordenamiento de Listas con Complejidad Óptima y Espacio Constante
11:44 - 10
Playground: Merge Two Sorted Lists
00:00 - 11

Intercalación de Listas Ordenadas en Python
09:04 - 12

Resolver el problema "Container with Most Water" en Python
01:18 - 13

Cálculo Óptimo de Área en Listas de Alturas
09:02 - 14
Playground: Container with Most Water
00:00 - 15

Implementación de solución de cálculo de área máxima en Java
15:42 - 16

Implementación de Trapping Rainwater en Complejidad Lineal
01:02 - 17
Retos de Algoritmos con Apuntadores en Python
02:44 - 18
Patrones de Dos Apuntadores: Soluciones a Problemas Comunes en Python
06:43
- 19

Patrón Ventana Deslizante para Análisis de Datos Secuenciales
02:33 - 20

Subcadena más larga sin caracteres repetidos: patrón ventana deslizante
01:51 - 21

Algoritmo de Ventana Deslizante para Subcadenas Únicas
11:05 - 22
Playground: Longest Substring Without Repeating Characters
00:00 - 23

Algoritmo Python para Substring más Largo Sin Repeticiones
14:16 - 24
Retos de Algoritmos: Dos Apuntadores y Subcadenas
01:50 - 25
Máximos 1s Consecutivos y Subcadenas sin Repeticiones
03:22
- 26

Algoritmo de búsqueda binaria en listas ordenadas
09:26 - 27

Búsqueda en Arrays Rotados: Encontrar Entero en Lista Ordenada
02:19 - 28

Búsqueda Binaria en Arreglos Rotados
04:59 - 29
Playground: Search in Rotated Arrays
00:00 - 30

Búsqueda en Arrays Rotados con C++
10:53 - 31

Búsqueda eficiente en matriz ordenada MxN
01:44 - 32

Búsqueda Binaria en Matrices 2D Ordenadas
06:33 - 33
Playground: Search 2D Array Matrix
00:00 - 34

Búsqueda Binaria en Matrices con Python
07:48
¿Cómo podemos encontrar el Longest Substring Without Repeating Characters?
En este artículo, nos sumergimos en la implementación del algoritmo para encontrar el Longest Substring Without Repeating Characters utilizando Python. Este problema puede parecer complejo si se enfrenta de forma incorrecta, pero utilizando estructuras y tácticas adecuadas, podemos resolverlo de manera eficiente. ¡Vamos a descubrir cómo hacerlo!
¿Cómo iniciamos el desarrollo del algoritmo?
Comenzamos definiendo las variables necesarias para implementar nuestro algoritmo:
inicio: un apuntador inicializado en cero que ayudará a definir el comienzo de la ventana deslizante que revisaremos.fin: otro apuntador que recorrerá el string, pero que no es necesario inicializar explícitamente al principio, ya que avanzará automáticamente con cada iteración.caracteres_a_posicion: un diccionario que almacenará la posición más reciente de cada carácter en el string.mayor_longitud: un entero que almacenará la longitud del substring más largo encontrado sin caracteres repetidos.
¿Cómo administramos la detección de duplicados?
Para detectar la repetición de caracteres, seguimos los pasos descritos a continuación:
- Iteración del string: Recorremos cada carácter del string con el apuntador
fin. - Revisión de duplicados: Si el carácter ya está en
caracteres_a_posiciony su posición es mayor o igual al inicio actual, esto indica un duplicado y, por tanto, actualizamos elinicioal índice siguiente al de la última aparición del duplicado. - Actualización de la posición: Independientemente de que haya un duplicado o no, actualizamos la posición de cada carácter en
caracteres_a_posicion. - Comparación de longitud: Calculamos la longitud del substring actual (
fin-inicio+ 1) y la comparamos conmayor_longitud, actualizando este último si es necesario.
El código para este algoritmo en Python es el siguiente:
def longest_substring_without_repeating_characters(s):
inicio = 0
caracteres_a_posicion = {}
mayor_longitud = 0
for fin in range(len(s)):
caracter_actual = s[fin]
if caracter_actual in caracteres_a_posicion and inicio <= caracteres_a_posicion[caracter_actual]:
inicio = caracteres_a_posicion[caracter_actual] + 1
caracteres_a_posicion[caracter_actual] = fin
mayor_longitud = max(mayor_longitud, fin - inicio + 1)
return mayor_longitud
¿Qué complejidades nos encontramos en el algoritmo?
La eficiencia del algoritmo se ve reflejada en dos tipos de complejidades:
-
Complejidad temporal: Es O(n), donde n es el número de caracteres en el string. Esto se debe a que recorremos el string solo una vez y utilizamos operaciones de búsqueda y almacenamiento constantes.
-
Complejidad espacial: Es O(n) en el peor caso, ya que el diccionario
caracteres_a_posicionpuede llegar a almacenar todos los caracteres del string si todos son distintos.
Este desarrollo nos muestra cómo podemos enfrentar problemas de algoritmos en principio complejos, utilizando un enfoque sistemático y eficiente. Los invitamos a seguir aprendiendo y reforzando habilidades de programación para resolver desafíos de forma efectiva. ¡El aprendizaje nunca termina!