Tengo una matriz que contiene cadenas. Tengo que leer las palabras una por una y generar palabras que tengan cualquier carácter que aparezca exactamente dos veces. Pero mi código también muestra 3 o más caracteres iguales. ¿Cómo puedo generar las palabras cuyo único carácter aparece dos veces? Por ejemplo, no mostrar: "aaaa" o "aaab"
const words = [ "asdf", "fdas", "asds", "d fm", "dfaa", "aaaa", "aabb", "aaabb" ]; function checkString(text,index){ if((text.length - index) == 0 ){ //stop condition return false; }else{ return checkString(text,index + 1) || text.substr(0, index).indexOf(text[index])!=-1; } } // example Data to test for(var idx in words){ var txt = words[idx]; if(checkString(txt,0)) { console.log(txt); } } const words = [ "asdf", "fdas", "asds", "d fm", "dfaa", "aaaa", "aabb", "aaabb" ]; /* Output have to be : asds dfaa aabb aaabb */ const words = [ "asdf", "fdas", "asds", "d fm", "dfaa", "aaaa", "aabb", "aaabb" ]; function checkString(text) { //create a map to store the frequency of characters let map = new Map(); for(let ch of text){ if(map.has(ch)){ map.set(ch, map.get(ch)+1); }else{ map.set(ch, 1); } } //now check if frequency of any character is equal to 2 return [...map.values()].some(x => x == 2); } // example Data to test for (let txt of words) { if (checkString(txt)) { console.log(txt); } }Puede crear un objeto que asigne letras en su cadena de entrada a sus ocurrencias en él, luego filtre las letras en función de si aparecen dos veces:
const checkString = (inputString) => { // Build an empty object const occurrences = {}; for (let char of inputString) { // For each character in the input string, add one to its occurrence count // If it has never appeared until now, occurrences[char] + 1 will evaluate // to NaN, and Nan || 1 is 1 occurrences[char] = occurrences[char] + 1 || 1; } // Get the characters appearing in the string const charsInInputString = Object.keys(occurrences); // Extract only the characters appearing exactly twice const charsAppearingTwice = charsInInputString.filter( (char) => occurrences[char] === 2 ); // Return true if there is at least one such character return charsAppearingTwice.length > 0; }; Su matriz final de palabras correctas sería entonces words.filter(checkString) .
Si desea formatear las palabras para que se muestren como una sola cadena , con un separador de espacios, puede usar el método .join :
const checkedWords = words.filter(checkString).join(" "); // = asds dfaa aabb aaabbUna mejor manera de hacerlo es escribir una función que tome una cadena y cuente cuántos de cada carácter contiene, y luego verifique si hay un carácter que aparece exactamente dos veces.
Algo en la línea de
function checkString(text){ const charAppearances = {}; text.split('').forEach( character => { charAppearances[character] = (charAppearances[character] || 0) + 1 }) return Object.values(charAppearances).includes(2); } El propósito de charAppearances es contar cuántas veces aparece un carácter, por ejemplo para la cadena 'asdf' será {a: 1, s: 1, d:1, f:1}
La sección forEach itera sobre los caracteres de la cadena y actualiza el recuento del carácter actual ( charAppearances[character] = (charAppearances[character] || 0) + 1 significa "Si el character existe en charAppearances , agréguele 1, de lo contrario sume 1 a 0, lo que dará como resultado 1)