JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptで2つの文字列がアナグラムかどうかを判定する方法

アナグラムとは

アナグラムとは、片方の文字列の文字を並べ替えるともう片方の文字列と一致するような、文字列のペアのことを指します。

例えば、「hello」と「lolhe」はアナグラムです。「lolhe」の文字を並べ替えれば「hello」を作ることができ、その逆も可能だからです。

ここでは、2つの文字列(str1とstr2)を引数として受け取るJavaScript関数を作成します。この関数は、2つの文字列が互いにアナグラムである場合にtrueを、そうでない場合にfalseを返す必要があります。

実装のアプローチとしては、各入力文字列について文字ごとの出現回数を記録したマップ(オブジェクト)を作成し、その2つのマップを比較して完全に一致するかどうかを確認する方法がシンプルで効果的です。

実装例

const str1 = 'hello';
const str2 = 'lolhe';
const charCount = string => {
    const table = {};
    for (let char of string.replace(/\W/g, "").toLowerCase()) table[char] = table[char] + 1 || 1;
    return table;
};
const anagrams = (stringA, stringB) => {
    const charCountA = charCount(stringA);
    const charCountB = charCount(stringB);
    if (Object.keys(charCountA).length !== Object.keys(charCountB).length)
        return false;
    for (let char in charCountA)
        if (charCountA[char] !== charCountB[char])
            return false;
    return true;
};
console.log(anagrams(str1, str2));

コードの解説

charCount関数:正規表現/\W/gを使って記号や空白を取り除き、文字列を小文字に変換した上で、各文字の出現回数をオブジェクトに記録して返します。これにより、大文字小文字や余計な記号の違いに影響されずに判定できます。

anagrams関数:まず2つの文字列それぞれの文字カウントマップを作成します。キー(文字の種類)の数が異なる場合は即座にfalseを返し、その後、片方のマップの各文字について、もう片方のマップでの出現回数と一致するかを確認します。すべての文字のカウントが一致すればtrueを返します。

出力

コンソールには以下のように出力されます。

true

この方法の計算量はO(n)で、文字列の長さに比例して処理されるため、比較的長い文字列でも効率的に動作します。

  1. JavaScriptのconst宣言とは?再代入できない変数の基本と使い方を解説

    JavaScriptのconst宣言は、値を再代入することも後から再宣言することもできない変数を作成するための構文です。constはES2015(ES6)で導入されました。 const宣言の主な特徴 一度値を代入すると、別の値に再代入することはできません。 同じ名前の変数を同じスコープ内で再宣言するとエラーになります。 宣言時に必ず初期値を代入する必要があります。 ブロックスコープ({}内でのみ有効)を持ちます。 それでは、JavaScriptにおけるconst宣言の実際のコードを見ていきましょう。 サンプルコード <!DOCTYPE html> <html>

  2. JavaScriptで文字列を検索する方法【search()メソッドの使い方を解説】

    JavaScriptで文字列を検索する方法 JavaScriptで文字列の中から特定の文字列を探すには、search()メソッドを使用します。このメソッドは、引数に渡した文字列(または正規表現)が対象の文字列内で最初に一致した位置(インデックス)を返し、見つからなかった場合は -1 を返します。 以下は、JavaScriptで文字列を検索するサンプルコードです。 サンプルコード <!DOCTYPE html> <html lang="en" > <head> <meta charset="UTF-8" />