为什么这个字谜函数不正确?

Why is this anagram function not correct?

刚拿到 Javascript class 的测试,但我错过了一个我觉得很确定的问题。

我们应该创建一个函数,如果两个字符串是变位词则返回 true,否则返回 false。我找不到这行不通的实例。如果有任何帮助,我将不胜感激!

这是我的:

function isAnagram(str1, str2){
    if(str1.length !== str2.length){
        return false;
    }
    else{
        for(var i = 0; i < str1.length; i++){
            if(!str2.includes(str1[i])){
                return false;
            }
         }
         return true;
     }
}

例如,因为您的函数无法通过此测试:

isAnagram('abba', 'abbb') === false

单个字符可以在您的函数中出现多次,例如比较 testtttt returns 为真。 修改函数的一种方法是每次在 for 循环中找到字符时从 str2 中删除字符:

function isAnagram(str1, str2){
  if(str1.length !== str2.length) return false;
  for(var i = 0; i < str1.length; i++){
    var found = str2.indexOf(str1[i]);
    if(found === -1) return false;
    str2 = str2.substr(0,found) + str2.substr(found + 1)
  }
  return true;
}

它无法处理两个单词的情况,它们的长度相等,使用相同的字母,但每个字母的编号不同。

这给出了误报:

console.log(isAnagram("deep", "depp"))

作为测试用例,您的代码会 return 成功,但违反了变位词的规则:

isAnagram("ooaooa", "oooooa");

它只是检查是否存在相同数量的字母,以及单词 a 中的每个字母是否都出现在单词 b 中,而不是两个单词中字母的 count .

它只检查 str1 的每个字母是否出现在 str2 中,而不管它们出现了多少次。

编辑:它也不检查 str2 是否有未出现在 str1 中的字母。

function isAnagram(str1, str2) {
  if (str1.length !== str2.length) {
    return false;
  } else {
    for (var i = 0; i < str1.length; i++) {
      if (!str2.includes(str1[i])) {
        return false;
      }
    }
    return true;
  }
}

console.log(isAnagram('hello', 'hlleo'), ', should be true'); // true: correct
console.log(isAnagram('bye', 'byee'), ', should be false'); // false: correct
console.log(isAnagram('byeb', 'byee'), ', should be false'); // true: incorrect
console.log(isAnagram('byeb', 'byte'), ', should be false'); // true: incorrect

备选方案。

const isAnagram = (s1, s2) => {
  return lowerify(s1) == lowerify(s2);
}

const lowerify = str => str.toLowerCase().split('').sort().join('');

console.log(isAnagram("Arrigo Boito", "Tobia Gorrio"));
console.log(isAnagram("abc", "CBa"));
console.log(isAnagram("deep", "depp"));

只需逐个字符地比较两个字符串并记录找到的匹配项数。总匹配项必须 >= 字符串长度(以适应字符可能重复的情况,例如 boot)

var i, j;
var z = 0;
function checkAnagram(str1, str2) {
    if (str1.length != str2.length) { return `${str1} and ${str2} are not anagram, lengths dont match!`; }
    else {
        for (i = 0; i < str1.length; i++) {
            for (j = 0; j < str2.length; j++) {
                if(str1[i] == str2[j]) {
               // console.log('matches',str1[i],str2[j]);
                z++;
                }
                }
            }
          //  console.log(z);
            if (z>=str1.length)
            return`${str1} and ${str2} are anagram!`;
            else return `${str1} and ${str2} are not anagram!`;
        }
}
console.log(checkAnagram('fired','fried'));
console.log(checkAnagram('logo','ogol'));
console.log(checkAnagram('abcd','abc'));