Contenido del curso
Dos Apuntadores
- 3

Patrón de dos apuntadores en algoritmos
02:56 min - 4

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

Ordenamiento de Palabras en Idiomas Alienígenas
12:04 min - 6

Playground: Verifying Alien Dictionary
- 7

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

Cómo fusionar dos arrays ordenados sin memoria extra
02:10 min - 9

Ordenamiento de Listas con Complejidad Óptima y Espacio Constante
11:44 min - 10

Playground: Merge Two Sorted Lists
- 11

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

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

Cálculo Óptimo de Área en Listas de Alturas
09:02 min - 14

Playground: Container with Most Water
- 15

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

Implementación de Trapping Rainwater en Complejidad Lineal
01:02 min - 17

Retos de Algoritmos con Apuntadores en Python
02:44 min - 18

Patrones de Dos Apuntadores: Soluciones a Problemas Comunes en Python
06:43 min
Ventana Deslizante
- 19

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

Subcadena más larga sin repetir caracteres
Viendo ahora - 21

Algoritmo de Ventana Deslizante para Subcadenas Únicas
11:05 min - 22

Playground: Longest Substring Without Repeating Characters
- 23

Sliding Window para substring sin repeticiones
14:15 min - 24

Retos de Algoritmos: Dos Apuntadores y Subcadenas
01:50 min - 25

Máximos 1s Consecutivos y Subcadenas sin Repeticiones
03:22 min
Búsqueda Binaria
- 26

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

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

Búsqueda Binaria en Arreglos Rotados
04:59 min - 29

Playground: Search in Rotated Arrays
- 30

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

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

Búsqueda binaria en matriz 2D ordenada
06:33 min - 33

Playground: Search 2D Array Matrix
- 34

Búsqueda Binaria en Matrices con Python
07:48 min
Próximos pasos
Subcadena más larga sin repetir caracteres
Resumen
El problema Longest Substring Without Repeating Characters es uno de los retos clásicos para entrenar el patrón de ventana deslizante (sliding window) en estructuras de datos. Aprenderás a identificar la subcadena más larga sin caracteres repetidos dentro de una cadena, optimizando la solución a una complejidad temporal O(n). Es ideal si te preparas para entrevistas técnicas o quieres dominar algoritmos eficientes sobre cadenas.
¿Qué pide el problema Longest Substring Without Repeating Characters?
El enunciado es directo: dada una cadena S, debes devolver la longitud de la subcadena más larga que no contenga caracteres repetidos. Lo que se retorna no es la subcadena en sí, sino su tamaño numérico.
Mira este caso: si la entrada es abcabcb, la respuesta es 3. ¿Por qué? Porque las subcadenas válidas sin repetir son abc, bca, cab, abc o bcb, y todas tienen longitud tres. Ninguna alcanza una longitud mayor.
¿Qué es una subcadena sin repetir caracteres? Es un fragmento contiguo de la cadena original donde cada carácter aparece una sola vez. En cuanto se repite uno, esa subcadena termina.
¿Cómo aplicar el patrón ventana deslizante a este reto?
El patrón sliding window o ventana deslizante consiste en mantener un rango dentro de la cadena que se expande o contrae según una condición. Aquí, la condición es que no haya caracteres repetidos dentro de la ventana.
La idea general que puedes diseñar:
- Define dos punteros que representen el inicio y el final de la ventana.
- Avanza el puntero derecho añadiendo caracteres a la ventana.
- Cuando aparezca un carácter repetido, mueve el puntero izquierdo hasta eliminar la repetición.
- Lleva un registro de la longitud máxima alcanzada en cada paso.
Este enfoque evita revisar todas las subcadenas posibles, que sería una solución cuadrática.
¿Por qué la complejidad debe ser O(n)? Porque cada carácter de la cadena se visita como máximo dos veces: una al expandir la ventana y otra al contraerla. Eso mantiene el tiempo lineal frente al tamaño de la entrada.
¿Cómo interpretar los ejemplos de entrada y salida?
Veamos cómo se traduce la lógica en los casos propuestos en clase [00:25]:
- Entrada
abcabcb→ salida3. Tienesabc, luego se repite laay la ventana se reinicia. Todas las subcadenas válidas tienen tamaño tres. - Una entrada más larga sigue la misma lógica: el algoritmo recorre, expande y contrae la ventana, devolviendo siempre la longitud máxima encontrada.
Lo importante es notar que el resultado es un número, no la cadena. Eso simplifica el diseño porque solo necesitas comparar tamaños.
¿Qué conceptos clave debes dominar para resolverlo?
Antes de implementar, asegúrate de tener claros estos elementos que aparecen en el reto:
- Subcadena: fragmento contiguo de una cadena, distinto de una subsequence que puede ser no contigua.
- Ventana deslizante: técnica con dos punteros que avanzan sobre la estructura para mantener un rango válido [00:50].
- Complejidad temporal O(n): el tiempo de ejecución crece de forma lineal con el tamaño de la entrada.
- Estructura auxiliar: típicamente un set o hash map para verificar en tiempo constante si un carácter ya está en la ventana.
Con estos conceptos en la cabeza, el diseño fluye casi solo.
¿Cuál es el reto antes de la siguiente clase?
No implementes todavía. Primero diseña la solución en papel o en pseudocódigo y asegúrate de que cumpla con la complejidad O(n) [01:15]. Piensa qué estructura usarás para detectar repeticiones y cómo moverás los punteros cuando aparezca un carácter ya visto.
Cuéntame en los comentarios cómo abordaste el diseño, qué dudas te surgieron y qué estructura elegiste para la ventana. Nos leemos ahí.