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 é:
- Criar um mapa de string
- Criar uma nova array para armazenar subsequências válidas
- Passar por todas as strings da array (
dictionary
) - Verificar se cada string é uma subsequência válida
- Se for, acrescentá-la à nova array que você criou
- 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]