Cartografia de strings explainer

Alguien que me pueda ayudar con este tema cartografia de strings explainer

2 Likes

Necesito ayuda no puedo hacerlo

9 Likes

Saludos,
Primero un poco de teoría:

Para verificar si una palabra en el arreglo (dictionary) es una subsecuencia del string (stringSequence), es importante saber qué caracteres están en StringSequence y dónde aparecen.

Para hacerlo, podemos convertir el string en un object.
Cada carácter en el string se convertirá en una propiedad, con los índices donde aparecen almacenados en un arreglo.

Este object se puede usar como un mapa, ya que muestra dónde están ubicados los carácteres del string.

Por ejemplo, un object creado a partir del string 'balloon' se vería así:
 { b: [0], a: [1], l: [2, 3], o: [4, 5], n: [6] };

Esto muestra que ‘balloon’ contiene los caracteres ‘b’, ‘a’, ‘l’, ‘o’ y ‘n’, y enumera los indices donde está ubicado cada carácter.

Un arreglo se usa para almacenar las posiciones del índice, porque puede aparecer un carácter más de una vez.

¿A qué string representa el siguiente object?

 let stringMap = {
     b: [0],
     o: [1, 2]
 };
Respuesta

“boo”

¿Por qué hacer un mapa? ¿Por qué no solo ciclar por stringSequence y comparar sus letras con cada palabra en dictionary?
La elaboración de un mapa evita que tengamos que ciclar por stringSequence una y otra vez para cada palabra en dictionary.

Al hacer un mapa, podemos ciclar por stringSequence solo una vez, lo que hace que la función sea más rápida y más eficiente.

Existen varias formas para hacer un object a partir de un string.

La siguiente función usa un classic for loop, una if…else statement, y el método push para crear el object:

 function mapString(string) {
   let map = {};
   for (let i = 0; i < string​.length; i++) {
     let letter = string[i];
     if (map[letter]) {
       map[letter]​.push(i);
     } else {
       map[letter] = [i];
     }
   }
   return map;
 }

La variable map se declara y almacena un object vacío.

 let map = {};

Un classic for loop itera por el string.

Una variable llamada letter almacena el carácter actual en el string a medida que el for loop itera.

 for (let i = 0; i < string​.length; i++) {
   let letter = string[i];
 }

La if…else statement verifica si una propiedad con el nombre de la letra actual existe en map.

Si la propiedad existe, el índice de la letra actual se introducirá en el arreglo almacenado en la propiedad.

Si no existe, el código en el bloque else creará la propiedad, y lo configura para que almacene un arreglo que contiene el índice de la letra actual.

 if (map[letter]) {
   map[letter]​.push(i);
 } else {
   map[letter] = [i];
 }

Después de que el classic for loop haya terminado de iterar por el string, el object map se devuelve.

Si la función se llama ‘abba’ como un argumento, ¿qué se devolverá?

     makeMap('abba');
     
     {a:[0,3], b:[1,2]}

La función toma un string.
La función devuelve un object.
La función crea un object vacío y lo almacena en una variable.
La función cicla por el string.
Para cada carácter en el string, la función verifica si existe una propiedad para ese carácter en el object.
Si es verdadero, el índice del carácter actual se introduce en el arreglo almacenado en esa propiedad.

     if (map[letter]) { 
    map[letter].push(i); 
    }

Si es falso, la función crea esta propiedad, y almacena un arreglo adentro que contiene el índice del carácter actual.

 else {
 map[letter] = [i];
}

Finalmente, el object se devuelve.

En este ejercicio se pide algo muy parecido:

Escribe una función que tome un string y devuelva un object.

El object debe tener una propiedad para cada uno de los caracteres del string.

Cada propiedad debe almacenar un arreglo de índices donde se encuentran los caracteres.

Por ejemplo: mapString(‘boohoo’) devolvería:

 { b: [0], o: [1, 2, 4, 5], h: [3] }
Codigo Final
 import { word } from 'grasshopper.wordList';
 console.log(word);
 function mapString(string, ___) {
   let map = {
     ___: ___
   };
   for (let i = 0; i < string.length; i++) {
     let letter = string[i];
     if (map[letter]) {
       map[letter].push(i);
    } else {
       map[letter] = [
         i,
         ___
       ];
     }
   }
   return map;
 };
 let stringMap = mapString(word);
 for (let letter in stringMap) {
   console.log(letter + ': ' + stringMap[letter]);
}

Espero que te sirva, si necesitas explicación de cada parte del código no dudes en contactarme.

Ánimo.

7 Likes

Mi codigo es así y me lo toma como errado, dice que tengo que poner un string vacío en let map, como hago para que no haya nada en el arreglo?

1 Like

Un object, no un arreglo

Saludos,

Cuando agregas el codigo del object lo pone así:

let map = {
___: ___
};

no le borres nada para que lo entienda bien.
espero que esto te sirva.

2 Likes

Gracias, ya vi que el problema era la posición de la funcion, pero gracias igual

Cuándo pongo el Retun me vuelve a pedir un if stai… porque?

Saludos,

si pones tu código para visualizarlo mejor, con gusto te explico.

hola, yo lo pongo tal cual está ai y me dice que no se definió el string, me podrían ayudar?

es una pesadilla escribir codigo en esta app, para escribir string o map y poner luego los corchetes [] sin que me borre strring o map es un infierno, hay que intentar como 100 veces en cada una, termina uno abandonando por fastidio

Buenas, me podrian ayudar con mi codigo. No puedo ver el error que me marca.