JavaScript字谜比较

Rya*_*yan 4 javascript

我试图比较两个字符串,看看它们是否是字谜.

我的问题是我只是比较每个字符串中的第一个字母.例如,"玛丽"和"军队"将返回真实,但遗憾的是"玛丽"和武器."

在返回true/false之前,如何比较两个字符串的每个字母?

这是一个jsbin演示(单击"控制台"选项卡查看结果"):

http://jsbin.com/hasofodi/1/edit

function compare (a, b) {
  y = a.split("").sort();
  z = b.split("").sort();
  for (i=0; i<y.length; i++) {
    if(y.length===z.length) {
      if (y[i]===z[i]){
        console.log(a + " and " + b + " are anagrams!");
        break;
      }
      else {
        console.log(a + " and " + b + " are not anagrams.");
        break;
      }
    }
    else {
      console.log(a + " has a different amount of letters than " + b);
    }
    break;
  }
}

compare("mary", "arms");
Run Code Online (Sandbox Code Playgroud)

Ori*_*iol 22

在排序之后,您可以join将数组再次转换为字符串,并让浏览器进行比较,而不是逐个字母地进行比较:

function compare (a, b) {
    var y = a.split("").sort().join(""),
        z = b.split("").sort().join("");
    console.log(z === y
        ? a + " and " + b + " are anagrams!"
        : a + " and " + b + " are not anagrams."
    );
}
Run Code Online (Sandbox Code Playgroud)

  • 这是最干净的解决方案,但它是最优化的解决方案吗?考虑到 Javascript 的内置函数 split、sort 和 join,如果我们计算 BigO,它的效率会是多少。@奥里奥尔 (3认同)

Raj*_*kar 6

如果您想编写一个函数而不使用内置函数,请检查以下解决方案。

function isAnagram(str1, str2) {

  if(str1 === str2) {
    return true;
  }

  let srt1Length = str1.length;
  let srt2Length = str2.length;

  if(srt1Length !== srt2Length) {
    return false;
  }

  var counts = {};

  for(let i = 0; i < srt1Length; i++) {
    let index = str1.charCodeAt(i)-97;
    counts[index] = (counts[index] || 0) + 1;
  }

  for(let j = 0; j < srt2Length; j++) {
    let index = str2.charCodeAt(j)-97;
    if (!counts[index]) { 
      return false; 
    }
    counts[index]--;
  }

  return true;
}
Run Code Online (Sandbox Code Playgroud)