32 votes

Comment comparer deux chaînes mélangées?

J'ai les deux chaînes suivantes:

 var str1 = "hello";
var str2 = "ehlol";
 

Comment puis-je vérifier si les deux chaînes contiennent les mêmes caractères?

38voto

gurvinder372 Points 16722

Peut ne pas être très optimal, mais vous pouvez simplement le faire

 str1.split("").sort().join() == str2.split("").sort().join(); //outputs true
 

Une autre approche suggérée dans l'un des commentaires (pour l'optimisation dans le cas où la longueur de chaîne est assez grande)

 str1.length===str2.length && str1.split("").sort().join() == str2.split("").sort().join(); //first check the length to quickly rule out in case of obvious non-matches
 

4voto

Cristy Points 4026

L'une des façons de le faire est d'utiliser une table de hachage: compter combien de fois chaque personnage apparaît. Notez que cela fonctionne mieux si vos personnages sont - ASCII.

La complexité de cet algorithme est - O(M+N+sigma)M, N sont les longueurs des chaînes et sigma est le nombre de lettres distinctes. La complexité de la solution retenue est plus élevé en raison de la tri, qui se fait généralement en O(N*logN), mais reste un bon un, si vos cordes sont courtes. Si vos cordes sont des centaines de milliers de caractères, puis c'est le chemin à parcourir. L'inconvénient de l'utilisation d' hash tables , c'est que l' memory d'utilisation est plus élevé que la solution qui utilise le tri.

function sameLetters(str1, str2){
  var hash = {};

  var len1 = str1.length;
  var len2 = str2.length;

  // Strings with different lengths can't contain the same letters
  if(len1 !== len2) return false;

  // Count how many times each character appears in str1
  for(var i = 0; i < len1; ++i) {
    var c =  str1[i];
    if(typeof hash[c] !== 'undefined') hash[c]++;
    else hash[c] = 1;
  }

  // Make sure each character appearing in str2 was found in str1
  for(var i = 0; i < len2; ++i) {
    var c =  str2[i];
    if(typeof hash[c] === 'undefined') return false;
    if(hash[c] === 0) return false;
    hash[c]--;
  }

  // Make sure no letters are left
  for(var c in hash) {
    if(hash[c]) return false;
  }    

  return true;
}

Vous pouvez ensuite appeler la fonction comme ceci (jouer avec elle dans le navigateur de la console):

sameLetters("hello", "ehlol"); // true
sameLetters("hello", "ehllol"); // false

3voto

Abrar Jahin Points 2097

Vous pouvez utiliser une fonction à cet effet comme la fonction sameChars ici-

 function myFunction()
{
    var input_1 = document.getElementById('input_1').value;
    var input_2 = document.getElementById('input_2').value;
    var result = sameChars(input_1,input_2);
    document.getElementById("demo").innerHTML = result;
}

function sameChars(firstStr, secondStr)
{
    var first = firstStr.split('').sort().join('');
    var second = secondStr.split('').sort().join('');
    return first.localeCompare(second)==0;
} 
 <input type="text" maxlength="512" id="input_1"/>
<input type="text" maxlength="512" id="input_2"/>
<button onclick="myFunction()">Check If Shuffled</button>
<p id="demo"></p> 

1voto

Tushar Points 23732

Voici une version modifiée de la réponse de Gurvinders .

 var str1 = "hello",
    str2 = "ehlol";

// Add sort on prototype of String object
String.prototype.sort = function () {
    return this.split('').sort().join('');
};

// First check if length of both is same
var same = str1.length === str2.length && str1.sort() === str2.sort();
console.log('Strings are same?', same);
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X