Dada una matriz de cadenas de igual longitud, le gustaría saber si es posible reorganizar el orden de los elementos de tal manera que cada par de cadenas consecutivas difiera exactamente en un carácter. Devuelve true si es posible y false si no.
Nota: ¡Solo está reorganizando el orden de las cadenas, no el orden de las letras dentro de las cadenas!
Ejemplo
Para inputArray = ["aba", "bbb", "bab"] , la salida debe ser:
solución (inputArray) = falso.
Hay 6 arreglos posibles para estas cuerdas:
* ["aba", "bbb", "bab"] * ["aba", "bab", "bbb"] * ["bbb", "aba", "bab"] * ["bbb", "bab", "aba"] * ["bab", "bbb", "aba"] * ["bab", "aba", "bbb"]Ninguno de estos cumple la condición de cadenas consecutivas que difieren en 1 carácter, por lo que la respuesta es falsa.
Para inputArray = ["ab", "bb", "aa"] , la salida debe ser:
solución (inputArray) = verdadero.
Es posible organizar estas cadenas de manera que cada par de cadenas consecutivas difiera en 1 carácter (por ejemplo: "aa", "ab", "bb" o "bb", "ab", "aa" ), por lo que devuelve verdadero .
Creo que el algoritmo podría describirse de la siguiente manera
Escriba una función que cuente las diferencias entre dos cadenas ( difCount() )
Compare cada par de cadenas (es decir, 1 con 2, 1 con 3, 2 con 3) para comprobar que todas las cadenas tienen un "amigo" que difiere solo en 1 carácter.
Si hay al menos una cadena que no tiene un par, la prueba falla.
arr = ["ff", "gf", "af", "ar", "hf"]; // count how many letters are differnt between two strings function difCount(str1, str2){ dif_count = 0; [...str1].map((val, ind) => { // val != str2[ind] is comparison between the chars in the neighboring strings at the same indexes (ie first with first, second with second) // if comparison passes, then it is 1, so dif_count (which counts the differences) increments, otherwise it doesn't increment dif_count += val != str2[ind]; }) return dif_count; } // create array of zeros with the length of arr.length checks = Array(arr.length).fill(0); // below we compare each element with every another element. //If there's a pair of strings str1 and str2 with the difference of 1 character, we set the corresponding indexes in "checks" array to 1. //If the "checks" array contains all 1's then all the strings have pairs, otherwise test fails. //If array contains duplicates, then test fails dupes = 0; arr.map((str1, ind1) => { arr.map((str2, ind2) => { if(difCount(str1, str2) == 1){ checks[ind1] = 1; checks[ind2] = 1; } if(str1 == str2 && ind1 != ind2) dupes = 1; }) }) // So, if there're no dupes and no zeros in the checks array, then the test has passed pass = !dupes && !checks.includes(0) ? "pass" : "fail"; console.log(pass)