У меня есть следующие две строки:
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
Один из рекомендуемых способов сделать это - использовать хеш-таблицу: подсчитать, сколько раз появляется каждый символ. Обратите внимание, что это лучше всего работает, если ваши символы 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
Вы можете использовать функцию для этой цели, например, 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>
Здесь представлена измененная версия 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);
Вы могли бы сказать следующее:
(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 })
Вы можете проверить, используя простой 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");
}