2016-02-24 3 views
30

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

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

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

+5

бы «привет» и «EHLO» считается матч, учитывая, что оба сделаны из тех же самых четырех букв? – nnnnnn

+0

«поделитесь одним и тем же алфавитом» неоднозначно, голосуйте за то, что вы не знаете, что хотите, или явно не уточняете его. –

+0

В случае, если производительность является проблемой, проверьте мой ответ на другой подход. – Cristy

ответ

37

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

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 
+0

@ gurvinder372 Будут ли одинаковые буквы счетчиком отдельно? Или как один? – guradio

+3

@guradio они будут учитываться индивидуально – gurvinder372

+4

Вы можете оптимизировать его, проверив длину: 'str1.length === str2.length && str1.split (" "). Sort(). Join() == str2.split ("") .sort() присоединиться() '. Дольше, но сэкономит вам некоторый ресурс в простых случаях. – Martijn

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>

+0

Тег JavaScript, а не Java :) – gurvinder372

+0

Извините, просто дайте мне мгновение, чтобы преобразовать его :( –

+0

Он по-прежнему java :), попробуйте его в консоли браузера и посмотрите – gurvinder372

4

Один из рекомендуемых способов сделать это - использовать хеш-таблицу: подсчитать, сколько раз появляется каждый символ. Обратите внимание, что это работает лучше всего, если ваши персонажи 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 
1

Вот модифицированная версия Gurvinders answer.

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); 
0

Вы могли бы сказать:

(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 }) 
0

Вы можете проверить с помощью простой цикл по каждому элементу. Перейдите через цикл (массив 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"); 
 
}

Смежные вопросы