Traté de resolver uno de los desafíos de Hackerrank String: Making Anagrams
Tengo 2 cadenas como esta:
let a: string = "fcrxzwscanmligyxyvym" let b: string = "jxwtrhvujlmrpdoqbisbwhmgpmeoke"¡y tengo una función que solo pasó 3 pruebas! :
function makeAnagram(a: string, b: string): number { type Map = { [key :string] : number } let string1 = a.split('') let string2 = b.split('') let map : Map = {} let deletedCount = 0 let firstCount = 0 let isMoreThanTwo = false for(let i of string1) { map[i] = (map[i] | 0) + 1 } for(let i of string2){ map[i] = (map[i] | 0) + 1 } for(let i in map) { if(map[i] == 1) { deletedCount++ firstCount++ } else if(map[i] > 2) { isMoreThanTwo = true deletedCount += (map[i] - 1) } } return isMoreThanTwo ? deletedCount + firstCount : deletedCount¿Hay alguna otra solución para contar los caracteres eliminados? y me pueden dar algun consejo, gracias
Acabo de resolver este problema, pero antes de pasar todos los casos de prueba, llegué a una solución en la que usé
for (let [k, v] of map) { remain += v; } que falló 13/16 casos de prueba, luego depuré el programa y me di cuenta de que a veces, cuando restamos 1 del anterior de este paso, va less than 0 , por lo que también tengo que manejar este caso, lo manejo como
for (let [k, v] of map) { remain += v < 0 ? v * -1 : v; }Ahora, todos los casos de prueba se pasan
function makeAnagram(a, b) { const [small, big] = a.length < b.length ? [a, b] : [b, a]; const map = new Map(); for (let c of small) { map.set(c, (map.get(c) ?? 0) + 1); } let remain = 0; for (let c of big) { !map.has(c) ? remain++ : map.set(c, map.get(c) - 1); } for (let [k, v] of map) { remain += v < 0 ? v * -1 : v; } return remain; } console.log(makeAnagram("fast", "sofasty"));