- 1

Grafos y Árboles: Estructuras de Datos Avanzadas
06:48 - 2

Estructuras de Datos: Introducción a Árboles y Sus Propiedades
07:12 - 3

Recursión: Concepto y Aplicaciones Prácticas con Ejemplos
09:11 - 4

Aplicaciones Prácticas de Grafos en Tecnología e Industria
05:16 - 5
Representación de Grafos: Matriz y Lista de Adyacencia
01:02
Implementación de búsqueda de palabras en matrices con DFS en JavaScript
Clase 47 de 52 • Curso de Algoritmos Avanzados: Grafos y Árboles
Contenido del curso
- 6

Búsqueda en Profundidad (DFS) en Árboles y Grafos
04:50 - 7

Implementación de DFS recursivo para búsqueda en árboles
12:10 - 8
Búsqueda en Profundidad (DFS) para Grafos: Enfoque Iterativo y Recursivo
01:27 - 9

Recorridos y Profundidad en Árboles Binarios y Enearios
07:09 - 10

Suma de Caminos en Árboles Binarios
02:05 - 11

Suma de Números de Raíz a Hoja en Árboles
07:32 - 12
Playground: Sum Root to Leaf Numbers
00:00 - 13

Implementación de Algoritmo DFS en Árboles Binarios con Golang
15:03 - 14

Resolución del Problema de Número de Islas con DFS
02:32 - 15

Conteo de Islas en Matrices con DFS
08:51 - 16
Playground: Number of Islands
00:00 - 17

Implementación de "Número de Islas" con Recursión en Python
10:18 - 18
Ejercicios Prácticos de Búsqueda en Profundidad (DFS)
02:22 - 19
Algoritmos de Búsqueda en Profundidad (DFS) en Problemas Comunes
06:19
- 20

Algoritmo BFS: Recorrido en Anchura de Grafos y Árboles
02:05 - 21

Implementación de BFS en Árboles usando Python
08:43 - 22

Movimiento mínimo de caballo en ajedrez infinito
02:55 - 23

Resolviendo el Problema Mínimo de Movimiento del Caballo en Ajedrez
08:11 - 24
Playground: Minimum Knights Moves
00:00 - 25

Resolución de Problemas de Caballos de Ajedrez con BFS en Python
17:49 - 26

Propagación de Plagas en Cultivos: Cálculo de Días para Contagio Total
03:50 - 27

Resolución de Rotting Oranges usando BFS
08:44 - 28
Playground: Rotting Oranges
00:00 - 29

Propagación de Plagas en Matrices usando BFS en Java
23:44 - 30

Construcción de Puentes Cortos entre Islas en Matrices Binarias
03:39 - 31

Resolución del Problema Shortest Bridge con DFS y BFS
07:36 - 32
Playground: Shortest Bridge Between Islands
00:00 - 33

Búsqueda del camino más corto entre islas usando BFS en Python
14:58 - 34
Búsqueda en anchura: Ejercicios prácticos y aplicaciones
03:41 - 35
Ejercicios avanzados de búsqueda en anchura (BFS) en programación
08:47
- 36

Algoritmo Backtracking: Solución de Problemas Complejos
04:21 - 37

Combinaciones de Letras en Números Telefónicos
01:52 - 38

Combinaciones de Letras a partir de un Número de Teléfono
09:20 - 39

Generación de combinaciones de letras con teclados numéricos en C++
14:08 - 40
Playground: Letter Combinations of a Phone Number
00:00 - 41

Generación de Direcciones IP Válidas a partir de Cadenas Numéricas
03:51 - 42

Generación de IPs válidas con backtracking en C++
28:17 - 43
Playground: Restore IP Addresses
00:00 - 44

Búsqueda de Palabras en Matrices: Solución y Complejidad
02:55 - 45

Búsqueda de Palabras en Matrices usando Backtracking y DFS
08:31 - 46
Playgrund: Word Search
00:00 - 47

Implementación de búsqueda de palabras en matrices con DFS en JavaScript
18:19 - 48
Resolución del problema de las n reinas en ajedrez
01:08 - 49
Ejercicios de Backtracking: Combinaciones y Permutaciones
01:05 - 50
Combinaciones y Permutaciones con Backtracking
02:14
¿Cómo implementar la función para verificar la existencia de una palabra en una matriz?
En esta clase, vamos a implementar una función en JavaScript que nos permitirá verificar si una palabra existe dentro de una matriz de caracteres. Esta es una técnica muy útil en el análisis de datos y manipulación de estructuras complejas. Comencemos entendiendo el proceso y las decisiones clave que se deben tomar al diseñar este tipo de algoritmos.
¿Cuál es el propósito de la función wordExists?
La función wordExists tiene el objetivo de recibir una matriz (un tablero de caracteres) y una palabra, y devolver si dicha palabra se encuentra representada en la matriz. Para esto, mantenemos un enfoque iterativo y recursivo, utilizando una búsqueda en profundidad (Depth-First Search, DFS) para analizar las posibles rutas de la palabra en la matriz.
function wordExists(matrix, word) {
let existe = false; // Variable booleana que almacenará si la palabra existe
for (let i = 0; i < matrix.length; i++) { // Recorremos filas
for (let j = 0; j < matrix[i].length; j++) { // Recorremos columnas
if (matrix[i][j] === word[0]) { // Si encontramos coincidencia con la primera letra
// Iniciamos búsqueda DFS a partir de esta posición
if (dfs(matrix, i, j, 0)) existe = true;
}
if (existe) return true; // Si existe, detenemos la búsqueda
}
}
return false;
}
¿Cómo se implementa la búsqueda en profundidad (DFS)?
La técnica DFS es clave en esta implementación. La función dfs se invoca cuando encontramos la primera letra de la palabra en la matriz. Desde ahí, buscamos de forma recursiva en las cuatro direcciones posibles (arriba, abajo, izquierda, y derecha), verificando que no salgamos de los límites de la matriz y que las letras coincidan nuevamente.
function dfs(matrix, x, y, index) {
if (index === word.length) return true; // Caso base: si index es igual a la longitud de la palabra
if (x < 0 || y < 0 || x >= matrix.length || y >= matrix[0].length) return false; // Limitar los bordes del tablero
if (matrix[x][y] !== word[index]) return false; // Diferencias entre la letra actual y la palabra
let temp = matrix[x][y]; // Guardamos la letra actual
matrix[x][y] = '#'; // Marcamos la coordenada como visitada con un simbolo que representa un carácter no existente
let found = dfs(matrix, x + 1, y, index + 1) ||
dfs(matrix, x - 1, y, index + 1) ||
dfs(matrix, x, y + 1, index + 1) ||
dfs(matrix, x, y - 1, index + 1);
matrix[x][y] = temp; // Revertimos la marca cuando retrocedemos en el recorrido
return found;
}
¿Qué consideraciones debemos tomar al diseñar esta solución?
-
Manejo de bordes: Al avanzar en la matriz, es esencial asegurarnos de no salirnos de los límites definidos, ya que podría causar errores. Esto se hace verificando las coordenadas antes de avanzar.
-
Evitación de revisitas: Para evitar contar el mismo camino dos veces, cambiamos temporalmente el valor de la celda en la matriz a un carácter no existente y lo restauramos después de explorar.
-
Optimización de espacio: En lugar de usar una estructura externa para marcar las visitas (como un hash set), reemplazamos temporalmente los valores en la misma matriz, reduciendo así el uso de memoria extra.
Este tipo de enfoque no solo mejora la eficiencia de la búsqueda al centrarse únicamente en rutas plausibles sino que también proporciona flexibilidad para resolver problemas más complejos en el futuro. Te animo a compartir tus experiencias en la sección de comentarios, donde puedes discutir posibles optimizaciones o variaciones, y así continuar aprendiendo y perfeccionando tus habilidades de programación.