Necesito eliminar letras comunes de ambas cadenas. Pero, algunas de las letras se eliminan, otras no. En este ejemplo, a es común en ambas cadenas, pero no se elimina. ¿Podrías decir el error que hice?
var a = "car" var b = "karthic" var c = a.length; var d = b.length; for (var i = 0; i < c; i++) { for (var j = 0; j < d; j++) { if (a[i] === b[j]) { a = a.slice(0, i) + a.slice(i + 1); b = b.slice(0, j) + b.slice(j + 1); break; } } } console.log(a + " " + b);Primero encuentre todas las letras comunes, luego elimínelas de cada cadena:
var a = "car" var b = "karthic" var c = a.length; var d = b.length; var commonLetters = []; for (var i = 0; i < c; i++) { for (var j = 0; j < d; j++) { if (a[i] === b[j]) { commonLetters.push(a[i]); } } } var regex = new RegExp('[' + commonLetters.join('') + ']', 'g') a = a.replace(regex, ''); b = b.replace(regex, ''); console.log('A: ' + a, 'B: ' + b, commonLetters);Puede convertir ambas cadenas en un conjunto, encontrar la diferencia y luego filtrar (incluir) cualquier carácter que esté incluido en la diferencia.
El acceso a un Set es O (1), que es mejor que su bucle O (n ^ 2) (en el peor de los casos). Tendrá que filtrar todos los caracteres en cada cadena para que tenga una complejidad O(n) como su caso base.
// Reusable const strSet = (str) => new Set(str.split('')); const setDiff = (a, b) => new Set(Array.from(a).filter(item => !b.has(item))); const prune = (str, set) => str.split('').filter(x => set.has(x)).join(''); // Specific const a = 'car', b = 'karthic'; const diff = setDiff(strSet(b), strSet(a)); const a1 = prune(a, diff), b1 = prune(b, diff); console.log(`a1 = "${a1}"\nb1 = "${b1}"`); let a = "car" let b = "karthic"; let resultA = a.split('').filter((elem) => b.indexOf(elem) == -1).join(''); let resultB = b.split('').filter((elem) => a.indexOf(elem) == -1).join(''); console.log(resultB); console.log(resultA);