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?
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?
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
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)
où 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
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>
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 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.