【问题标题】:Check for Anagram in 2 strings检查 2 个字符串中的 Anagram
【发布时间】:2022-02-14 18:46:59
【问题描述】:

我创建了一个函数来检查 2 个单词是否是字谜,但我想让它变得更好。感觉if语句后面的counter声明不太好,如果有人有更好的解决方案就好了。

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;
    }

【问题讨论】:

  • 附注:string1 === string2 返回 false。毕竟,“apples”不是“apples”的字谜。
  • 字谜是由相同字母组成的单词,但顺序不同。话虽这么说,要检查一个字谜,你唯一需要做的就是为每个单词创建一个字母数组,对数组进行排序并比较它们。你想要的功能在这里:stackoverflow.com/a/23785653/5768908

标签: javascript


【解决方案1】:

这是一种更简单的方法:

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);

【讨论】:

  • 把 s2 改成 "ttse" 你得到一个 "false"。
  • ???我认为您想要.sort() 而不是.reverse(),并且您必须对both 字符串进行排序。 anagram 是由另一个单词中的字母任意重新排列形成的单词。
  • 哎呀,我误解了这个问题一秒钟
  • 好的,现在应该是正确的。我在想一个回文。
  • 您应该在排序之前将字符串转换为小写,以防单词使用混合大小写,因为它会对它们进行不同的排序。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:
    function checkAnagram(string1, string2) {
       return string1.replace(/[^\w]/g,'').toLowerCase().split('').sort().join('') === 
            string2.toLowerCase().replace(/[^\w]/g,'').split('').sort().join('')
    }
    

    【讨论】:

    • 如果你也能解释你的代码会很有帮助。
    • 将字符串转换为小写并确保使用正则表达式消除空格并对其进行排序和比较
    【解决方案4】:

    如果您不想使用 .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 }
    

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

    【讨论】:

      【解决方案5】:
      function isAnagram(str1, str2){
          if(str1.length !== str2.length){
              return false
          }
      
          let string1 = str1.toLowerCase().split('').sort().join('');
          let string2 = str2.toLowerCase().split('').sort().join('');
          return string1 === string2
      }
      isAnagram('abcdef', 'AbcFed')
      

      【讨论】:

        猜你喜欢
        • 2015-02-08
        • 2017-07-18
        • 2019-05-21
        • 2016-03-29
        • 2016-02-20
        • 1970-01-01
        • 2015-12-21
        • 2012-03-20
        • 1970-01-01
        相关资源
        最近更新 更多