2016-11-26 3 views
1

J'ai des problèmes avec la question ci-dessous. Je dois écrire un code/une fonction qui retourne true si une partie de str1 peut être réorganisée en str2.Comment écrire une fonction qui retourne true si une partie de str1 peut être réarrangée en str2?

Brouille de fonction d'écriture (str1, str2) qui renvoie true si une partie des caractères str1 peut être réarrangée pour correspondre à str2, sinon renvoie false.

Par exemple: str1 est 'rkqodlw' et str2 est 'monde' la sortie doit renvoyer true. str1 est 'cedewaraaossoqqyt' et str2 est 'codewars' devrait retourner vrai. str1 est 'katas' et str2 est 'steak' devrait retourner false.

Seules les lettres minuscules seront utilisées (a-z). Aucune ponctuation ou chiffres ne seront inclus. Les performances doivent être prises en compte.

Ci-dessous le code actuel j'ai:

function scramble(str1, str2) { 
    var first; //longer string 
    var second; //shorter string 

    if(str1 || str2 === "undefined") { 
    return false; 
    } 

    if(str1.length > str2.length) { 
    first = str1; 
    second = str2 
    } else if(str2.length > str1.length) { 
    first = str2; 
    second = str1; 
    } 

    for (i=0; i<second.length; i++) { 
    if (first.indexOf(second[i]) === -1) { 
     return false; 
    } 
    } 

    return true; 

} 

Pourriez-vous s'il vous plaît me aider avec cette question?

+2

Je suis confus, ne serait-il être aussi simple que de vérifier si tous les caractères '' str2' sont en str1', et si oui, vrai retour? – adeneo

+1

Aussi, 'if (str1 || str2 ===" undefined ") {' ne fait pas ce que vous pensez probablement faire –

Répondre

1

Divisez les chaînes en tableaux et vérifiez si chaque caractère de la deuxième matrice se trouve dans le premier tableau.

Vous voulez probablement épissure de caractères que vous allez, pour tenir compte des mulitiples du même caractère

function scramble(str1, str2) { 
 
    var [arr1, arr2] = [str1.split(''), str2.split('')]; 
 
    return arr2.every(x=>arr1.indexOf(x)===-1?false:arr1.splice(arr1.indexOf(x),1)); 
 
} 
 

 
console.log(scramble('rkqwodlw', 'world'));  // true 
 
console.log(scramble('mgoaon', 'moon'));  // true 
 
console.log(scramble('oijhnnassduda', 'moon')); // false, only one "o" 
 
console.log(scramble('test', 'unicorn'));  // false

1

Voici la fonction avec quelques tests:

function scramble(str1, str2) { 
 
    var l = str2.length; 
 
    for (var i = 0; i < l; i++) { 
 
    if (str1.indexOf(str2[i]) > -1) { 
 
     str1 = str1.replace(str2[i], ''); 
 
    } else { 
 
     return false; 
 
    } 
 
    } 
 
    return true; 
 
} 
 

 
function test(str1, str2) { 
 
    console.log('testing "'+str1+'" w/ "'+str2+'": '+(scramble(str1, str2) ? 'true' : 'false')); 
 
} 
 

 
test('rkqodlw', 'world'); 
 
test('cedewaraaossoqqyt', 'codewars'); 
 
test('katas', 'steak');

Les tests reviennent:

testing "rkqodlw" w/ "world": true 
testing "cedewaraaossoqqyt" w/ "codewars": true 
testing "katas" w/ "steak": false 

La fonction vérifie si tous les caractères de str2 est en str1 et il enlève de str1 de sorte que char de str1 ne compte pas deux fois.

3

Vous pouvez utiliser une table de hachage avec le nombre de lettres et vérifier avec compte et décrémenter le nombre.

Cette proposition ne mutile pas les tableaux.

function scramble(str1, str2) { 
 
    var count = Object.create(null); 
 

 
    Array.prototype.forEach.call(str1, function(a) { 
 
     count[a] = (count[a] || 0) + 1; 
 
    }); 
 

 
    return Array.prototype.every.call(str2, function(a) { 
 
     return count[a]--; 
 
    }); 
 
} 
 

 
console.log(scramble('rkqodlw', 'world'));    // true 
 
console.log(scramble('cedewaraaossoqqyt', 'codewars')); // true 
 
console.log(scramble('katas', 'steak'));    // false 
 
console.log(scramble('', 'o'));    // false

+0

Un peu plus difficile à comprendre, mais une meilleure complexité de temps que les autres solutions. –

+0

droite, pas d'index de et juste O linéaire –

+0

Permet de le tester -> https://jsperf.com/scramble-thingy – adeneo