如何比较两个洗牌的字符串?

时间:2016-02-24 05:13:36

标签: javascript

我有以下两个字符串:

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

如何检查两个字符串是否包含相同的字符?

6 个答案:

答案 0 :(得分:38)

可能不是最优,但你可以做到

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

答案 1 :(得分:4)

推荐的方法之一是使用哈希表:计算每个字符出现的次数。请注意,如果您的字符为ASCII,则效果最佳。

此算法的复杂性为O(M+N+sigma),其中MN是字符串的长度,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

答案 2 :(得分:3)

您可以为此目的使用函数,例如sameChars函数 -

&#13;
&#13;
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;
}
&#13;
<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>
&#13;
&#13;
&#13;

答案 3 :(得分:1)

这是Gurvinders answer的修改版本。

let storyboard = UIStoryboard(name: "StoryboardName", bundle: nil)
let destVC = storyboard.instantiateViewControllerWithIdentifier("PersonalInformationId") as! PersonalInformation
var arrayToSegue: [String] = self.userInformation
destVC = arrayToSegue

// present or push, as you wish 
presentViewController(destVC, animated: true, completion: nil)

答案 4 :(得分: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 })

答案 5 :(得分:0)

您可以使用简单的foreach循环进行检查。迭代循环(String数组)并检查第一个String数组中第二个String的每个元素。

&#13;
&#13;
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");
}
&#13;
&#13;
&#13;