检查2个字符串中的Anagram

时间:2016-08-14 13:34:02

标签: javascript

我创建了一个函数来检查2个单词是否是字谜,但我想让它变得更好。在if语句中我觉得计数器的声明不太好,如果有人有更好的解决方案会很棒。

function checkAnagram(string1, string2){

        if(string1.length !== string2.length){
            return false;
        }

        for(var i = 0; i < string1.length; i++){

            if(count <= 0){

                return false;
            }
            var count = 0;

            for(var t = 0; t < string2.length; t++){

                //counter = 0

                if(string2[t].toLowerCase() == string1[i].toLowerCase()){
                    //counter++;
                    count++;
                    break;
                }


            }

        }

        return true;
    }

4 个答案:

答案 0 :(得分:8)

这是一种更简单的方法:

var s1 = "test"
var s2 = "tset"

function testAnagram (s1, s2){

 if(!s1 || !s2 || s1.length !== s2.length){return false;}

 var lS1 = s1.toLowerCase();
 var lS2 = s2.toLowerCase();

 if(lS1 === lS2) {return false;}

 var rS1 = lS1.split('').sort().join('');
 var rS2 = lS2.split('').sort().join('');

 return rS1 === rS2;
}



var result = testAnagram(s1, s2);

alert(result);

答案 1 :(得分:6)

对于字符串'aabb'和'abcc',您的代码返回true,这不是字谜。您可以对字符串进行排序并检查它们是否相等:

function checkAnagram(string1, string2) {
   return string1.toLowerCase().split("").sort().join("") === string2.toLowerCase().split("").sort().join("")
}

答案 2 :(得分:1)

function checkAnagram(string1, string2) {
   return string1.replace(/[^\w]/g,'').toLowerCase().split('').sort().join('') === 
        string2.toLowerCase().replace(/[^\w]/g,'').split('').sort().join('')
}

答案 3 :(得分:0)

如果您不想使用.split().sort().join()之类的预构建方法,则

function isAnagrams(stringA, stringB) {
      // just to remove special char and convert it to lowercase
      stringA = stringA.replace(/[^\w]/g, "").toLowerCase();
      stringB = stringB.replace(/[^\w]/g, "").toLowerCase();
      if (stringA.length !== stringB.length) return false;
      let aCharMap = {};
      let bCharMap = {};
      /* 
        making of mapObject of both string, containing character as property and 
        count of that character as value 
      */
      for (let i = 0; i < stringA.length; i++) {
        bCharMap[stringB[i]] = bCharMap[stringB[i]] + 1 || 1;
        aCharMap[stringA[i]] = aCharMap[stringA[i]] + 1 || 1;
      }
      //  checking both CharMap value
      for (let q of stringB) {
        if (bCharMap[q] !== aCharMap[q]) {
          return false;
        }
      }
      return true;
}  

console.log(`isAnagram : ${isAnagrams('rail safety', 'fairy tales')}`)

因此,如果您通过isAnagrams('rail safety','fairy tales');,则字符映射将如下所示

aCharMap = { r: 1, a: 2, i: 1, l: 1, s: 1, f: 1, e: 1, t: 1, y: 1 }
bCharMap = { f: 1, a: 2, i: 1, r: 1, y: 1, t: 1, l: 1, e: 1, s: 1 }

然后我们将根据结果比较它们是否具有相同的值