У меня есть следующие две строки:Как я могу сравнить две перетасованные строки?
var str1 = "hello";
var str2 = "ehlol";
Как я могу проверить, содержат ли обе строки одни и те же символы?
У меня есть следующие две строки:Как я могу сравнить две перетасованные строки?
var str1 = "hello";
var str2 = "ehlol";
Как я могу проверить, содержат ли обе строки одни и те же символы?
Может быть не очень оптимальным, но вы можете просто сделать
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
@ gurvinder372 Будут ли одинаковые буквы счетчиком отдельно? Или как один? – guradio
@guradio они будут учитываться индивидуально – gurvinder372
Вы можете оптимизировать его, проверив длину: 'str1.length === str2.length && str1.split (" "). Sort(). Join() == str2.split ("") .sort() присоединиться() '. Дольше, но сэкономит вам некоторый ресурс в простых случаях. – Martijn
Вы можете использовать функция для этой цели, как 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>
Тег JavaScript, а не Java :) – gurvinder372
Извините, просто дайте мне мгновение, чтобы преобразовать его :( –
Он по-прежнему java :), попробуйте его в консоли браузера и посмотрите – gurvinder372
Один из рекомендуемых способов сделать это - использовать хеш-таблицу: подсчитать, сколько раз появляется каждый символ. Обратите внимание, что это работает лучше всего, если ваши персонажи 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
Вот модифицированная версия 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);
Вы могли бы сказать:
(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 })
Вы можете проверить с помощью простой цикл по каждому элементу. Перейдите через цикл (массив 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");
}
бы «привет» и «EHLO» считается матч, учитывая, что оба сделаны из тех же самых четырех букв? – nnnnnn
«поделитесь одним и тем же алфавитом» неоднозначно, голосуйте за то, что вы не знаете, что хотите, или явно не уточняете его. –
В случае, если производительность является проблемой, проверьте мой ответ на другой подход. – Cristy