Подтвердить что ты не робот

Как я могу сравнить две перетасованные строки?

У меня есть следующие две строки:

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

Как проверить, содержат ли обе строки одни и те же символы?

4b9b3361

Ответ 1

Не может быть очень оптимальным, но вы можете просто сделать

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

Другой предложенный подход в одном комментарии (для оптимизации в случае, если длина строки довольно большая)

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

Ответ 2

Один из рекомендуемых способов сделать это - использовать хеш-таблицу: подсчитать, сколько раз появляется каждый символ. Обратите внимание, что это лучше всего работает, если ваши символы ASCII.

Сложность этого алгоритма O(M+N+sigma), где M, N - это длины строк, а sigma - количество различных букв. Сложность принятого решения выше из-за сортировки, которая обычно выполняется в O(N*logN), но все же хорошая, если ваши строки короткие. Если ваши строки имеют сотни тысяч символов, то это путь. Недостатком использования hash tables является то, что использование memory выше, чем решение, использующее сортировку.

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;
}

Затем вы можете вызвать эту функцию (играйте с ней в консоли браузера):

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

Ответ 3

Вы можете использовать функцию для этой цели, например, sameChars здесь -

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>

Ответ 4

Здесь представлена ​​измененная версия 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);

Ответ 5

Вы могли бы сказать следующее:

(a.length === b.length) &&   (a.split('').every(function(val) { return b.indexOf(val) > -1}))

И в ES6 вы можете сделать это следующим образом:

(a.length === b.length) && a.split('').every(val => { return b.indexOf(val) > -1 })

Ответ 6

Вы можете проверить, используя простой foreach Loop. Перейдите через цикл (массив String) и проверьте каждый элемент второго String внутри массива первой строки.

var str1 = "hello";
var str2 = "ehlol";
var array1 = str1 .split("") ;
var array2= str2 .split("");
var isMatched = true;
if(array1.length == array2.length ){
array2.forEach(function(elem , i){
  if(array1.indexOf(elem) <0){
   isMatched = false;
   return false;
  }
})
}
if(!isMatched){
 console.log("Not Matched");
}else{
 console.log("Matched");
}