Anagrams


References
この文書は、次のリンクのSection 9. Anagrams課程から抜粋します.
The Coding Interview Bootcamp: Algorithms + Data Structures on Udemy
Solution 1. simpler ver. with RegExp
// my solution
function anagrams(stringA, stringB) {
  const sortedStringA = stringA.split("").sort().join("").toLowerCase();
  const sortedStringB = stringB.split("").sort().join("").toLowerCase();
  
  return sortedStringA === sortedStringB;
}

console.log(anagrams("RAIL! SAFETY!", "fairy tales"));
// simpler ver. with RegExp
function anagrams(stringA, stringB) {
  return cleanString(stringA) === cleanString(stringB);
}

function cleanString(str) {
  return str.replace(/[\W]/g, "").toLowerCase().split("").sort().join("");
}

console.log(anagrams("RAIL! SAFETY!", "fairy tales"));
私が作ったコードはコンソールウィンドウとtestです.jsの結果値が一致しないため,正規式を用いた模範解答を基準に説明する.sort()の方法で文字列をアルファベット順に整理して比較する方法はそれほど悪くないはずです.
  • 関数cleanStringは、正規式replace(/[\W]/g, "")を経て、文字列strから特殊文字を削除する、文字列をアルファベット順に並べ替える
  • .
  • 関数anagramsによって文字列stringAstringBを比較し、一致する場合はtrueを返します.
  • Solution 2. with for...in & if & RegExp
    function anagrams(stringA, stringB) {
      const aCharMap = buildCharMap(stringA);
      const bCharMap = buildCharMap(stringB);
    
      // obj aCharMap의 key 개수와 bCharMap의 key 개수가 다르면 false 반환(다른 문자가 섞여 있다는 뜻)
      if (Object.keys(aCharMap).length !== Object.keys(bCharMap).length) {
        return false;
      }
      // obj aCharMap의 value of key와 bCharMap의 value of key를 비교해서 다르면 false(문자열 내 각 문자의 등장횟수)
      for (let char in aCharMap) {
        if (aCharMap[char] !== bCharMap[char]) {
          return false;
        }
      }
    
      return true;
    }
    
    function buildCharMap(str) {
      const charMap = {};
      // str을 RegExp 활용하여 특수문자, 공백, 숫자 등을 ""으로 치환하고 소문자로 반환
      for (let char of str.replace(/[\W]/g, "").toLowerCase()) {
        // obj charMap에 char를 key로 할당하고 새로운 값이면 '1', 존재하던 값이면 1을 증가
        charMap[char] = charMap[char] + 1 || 1;
      }
      return charMap;
    }
    
    console.log(anagrams("RAIL! SAFETY!", "fairy tales"));

    以上の画像から分かるように、関数falseによって生成された2つのオブジェクトbuildCharMapaCharMapとを比較して、bCharMapの値を返す.
    一緒に見る
    正規表現の定理