Putting It All Together pt-br Explainer

Explicação de Juntando tudo

Objetivo deste desafio: Encontre a subsequência mais longa da string a partir de uma array.

Passo a passo da solução: O esquema para resolver este desafio é:

  1. Criar um mapa de string
  2. Criar uma nova array para armazenar subsequências válidas
  3. Passar por todas as strings da array (dictionary)
  4. Verificar se cada string é uma subsequência válida
  5. Se for, acrescentá-la à nova array que você criou
  6. Por último, usar a função longestWord() para retornar a subsequência mais longa válida de sua nova array

Criar o mapa é simples porque você já criou uma função para ele: mapString(). Armazene o resultado em uma nova variável; você poderia nomeá-la map.

Criar uma nova array para armazenar qualquer correspondência é semelhante: let listOfSubsequences = []. Isso pode ficar vazio, porque vamos enchê-lo 1 de cada vez dentro do laço.

O laço for of funcionará bem para verificar cada uma das strings da array: for (let word of dictionary) {...}

A função isSubsequence() do desafio anterior é útil agora. Ela precisa de 2 argumentos: uma string e um objeto Map, então ela retornará se a string é uma subsequência desse objeto Map (ou melhor, a string que o Map representa). Como a função retorna true ou false, faz sentido usá-la como um teste em uma If Statement.

Se o teste for verdadeiro, então a word é uma subsequência, e deve ser adicionada à array listOfSubsequences. Isso pode ser feito usando-se o método .push().

Conforme o laço for continua, ele adicionará todas as subsequências válidas a listOfSubsequences. Quando tivermos essa lista, só precisaremos retornar a mais longa. Felizmente, fizemos uma função para isso: longestWord(). Após o laço, adicionar return longestWord(listOfSubsequences).
Código Adicional (código oculto executado antes do código do desafio):
[detalhes]

let _longestWord = (words) => {
  let longestWord = '';
  for (let word of words) {
    if (word.length > longestWord.length) {
      longestWord = word;
    }
  }
  return longestWord;
};

let _createStringMap = (string) => {
  let stringMap = {};
  for (let i = 0; i < string.length; i++) {
    let letter = string[i];
    if (stringMap[letter]) {
      stringMap[letter].push(i);
    } else {
      stringMap[letter] = [i];
    }
  }
  return stringMap;
};

let _findNextIndex = (mappedIndices, nextUsableIndex) => {
  for (let index of mappedIndices) {
    if (index >= nextUsableIndex) {
      return index + 1;
    }
  }
  return false;
};

let _isSubsequence = (dictionaryWord, map) => {
  let nextUsableIndex = 0;
  for (let letter of dictionaryWord) {
    if (map[letter]) {
      nextUsableIndex = _findNextIndex(map[letter], nextUsableIndex);
      if (nextUsableIndex) {
      } else {
        return false;
      }
    } else {
      return false;
    }
  }
  return true;
};



defineModule(
    'subsequence.functions',
    {
        longestWord: _longestWord,
        mapString: _createStringMap, 
        findNextIndex: _findNextIndex,
        isSubsequence: _isSubsequence
    }
);

defineModule(
    'subsequence.words',
    {
        dictionary: ['art','vascular','avast','javas','vat'],
        stringSequence: 'javascript'
    }
);

[/details]

6 Likes

Olá, bom dia.
Não estou conseguindo avançar nesse desafio. Alguém poderia me ajudar?

O que estou fazendo de errado?

Grato.

4 Likes


no if (word = isSubSequence(word, map))
Não precisa desse “word = " apaga o “word =” e deixa só”" if (isSubSequence(word, map))""
e é pra funcionar
O “”“listOfSubsequence.push(word); “”” é o que vai salvar as palavras na lista

3 Likes

Olá,

O seu “return longestWord(listOfSubsequences,___);” parece estar no local incorreto. Está identado dentro do for, sendo assim ele retornará a cada iteração. Ele deveria estar fora do for, ao final da função para retornar a palavra mais longa somente ao final do preenchimento do array ListOfSubsequences.

Além disso, o seu if basta ter isSubsequence(word, map). Se a palavra for uma subsequência naturalmente será retornada o valor boleano True e ele entrará no laço.

Uma outra questão é que, embora não seja necessária a comparação com word, conforme descrito acima, a comparação foi feita com o símobolo =, que significa atribuição e não um operador de comparação. Para verificar a igualdade o símbolo === deveria ser usado.

Espero que possa ter te ajudado de alguma maneira.

8 Likes

Obrigado, ajudou muito.

Obrigado, Márcio. Ajudou muito.

alguém poderia me explicar porque meu código não funciona?

Obrigado pela carona.

Bom não funciona porque você colocou ““return”” antes do “” listOfSubsequence.push(word);"",
O motivo é que uma função sempre para no primeiro ““return”” que ela tiver, todo o código depois do primeiro ““return”” é ignorado.
Quando você colocou e “definiu” o ““if (isSubsequence(word, map, ))”” dentro do “for” ele não precisa de “return” por que se for verdadeiro e houver “subsequencia” o if tem que executar alguma ação e dar continuidade a função, acaba que o primeiro ““return”” por assim dizer cancelou o outro que chama a lista de subsequencia em ““return longestWord(listOfSubsequences, );””, Apaga o primeiro ““return”” antes de ““listOfSubsequences.push(word);”” que da certo!
deixa só o ““listOfSubsequence.push(word);””

Não sei se consegui explicar o motivo, sou iniciante mas tamo ae tentando kk.

2 Likes

Ta ai minha resposta…

5 Likes


Porque não funciona