Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

178
Visualizações
Encuentre índices dentro de una cadena donde se encuentra cualquier combinación de una matriz de palabras

Datos de muestra: Cadena: "barfoofoobarthefoobarman" Matriz de palabras: ["bar", "foo", "the"]

Salida: [6, 9, 12]

Me hicieron esta pregunta durante una entrevista. Debido a la limitación de tiempo, traté de encontrar todas las palabras posibles que se pudieran formar con la matriz de palabras (es decir, "barfoothe"), pero me dijeron que eso no sería escalable para matrices grandes. Se sugirió usar una estructura de datos de mapa, pero creo que mi solución tampoco escala, y es de fuerza bruta.

Aquí está la solución.

 var solution = function(string, words) { let output = []; let wordsMap = new Map(); let wordsNumber = words.length; let wordLength = words[0].length; words.forEach((word) => { if (!wordsMap.has(word)) wordsMap.set(word, 1); else wordsMap.set(word, wordsMap.get(word) + 1); }); for (let i = 0; i <= string.length-(wordsNumber*wordLength); i+=wordLength) { let tempMap = new Map(wordsMap); let check = true; let tempString = string.substring(i, i + wordsNumber*wordLength); for (let j = 0; j <= tempString.length - wordLength; j += wordLength) { let tempString2 = tempString.substring(j, j + wordLength); if (tempMap.has(tempString2)) tempMap.set(tempString2, tempMap.get(tempString2) - 1); } for (let val of tempMap.values()){ if (val !== 0){ check = false break; } } if (check) output.push(i) } console.log(output); } solution("barfoothefoobarman", ["foo", "bar"]);

¿Alguna sugerencia para una solución más inteligente?

about 4 years ago · Juan Pablo Isaza
2 Respostas
Responde à pergunta

0

Podría crear una expresión regular dinámica.

 const words = ['foo', 'bar'] const rx = new RegExp(words.join('|'), 'g') // todo escape special characters

Luego busque lejos.

 const counts = words.map(it=>0) // [0,0] // todo use map or object to track counts instead of array while (m = rx.exec(inputString)) { const index = words.indexOf(m[0]) counts[index]++ }
about 4 years ago · Juan Pablo Isaza Relatório

0

Gracias por su pregunta. Creo que la pregunta en la entrevista fue menos sobre la solución correcta y más sobre el enfoque correcto.

La parte más complicada es encontrar las combinaciones de palabras. Hay varios enfoques aquí. Para mí es un caso claro de recursividad.

Así que mi enfoque sería:

  1. encuentra todas las combinaciones de palabras, excepto las combinaciones consigo mismo (por ejemplo: foofoo o barbar).
  2. repita las combinaciones de palabras y pregunte si están contenidas en la cadena.
  3. extra: Ordenar SolutionArray Listo!

Nota: uso indexOf() para el punto 2, pero creo que una coincidencia de expresiones regulares lo haría aún mejor porque encuentras todas las posibilidades de una palabra en una cadena y no solo la primera como con indexOf. Tendría sentido para cadenas más largas.

 const arr = ["foo", "bar"]; const str = "barfoothefoobarman" let res = []; const combinations = (len, val, existing) => { if (len == 0) { res.push(val); return; } for(let i=0; i<arr.length; i++) { if(! existing[i]) { existing[i] = true; combinations(len-1, val + arr[i], existing); existing[i] = false; } } } const buildCombinations = (arr = []) => { for(let i = 0; i < arr.length; i++) { combinations(arr.length - i, "", []); } }; buildCombinations(arr); // exclude the base wordes from result array newRes = res.filter((e) => { if (! arr.includes(e)) { return e; } }) console.log('all word combinations:', newRes); // get the string position const _positions = []; newRes.forEach((w) => { let res = str.indexOf(w); if (res != -1 && ! _positions.includes(res)) { _positions.push(res); } }) // sort array and use Float64Array to speed up const positions = new Float64Array(_positions) console.log('positions', positions.sort())

about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda