【C言語】つの文字列がアナグラム(同じ文字で構成されるが順番が異なる)かどうかを判定するプログラム

【C言語】つの文字列がアナグラム(同じ文字で構成されるが順番が異なる)かどうかを判定するプログラム

1. はじめに

2. アナグラムとは

3. アナグラム判定方法

4. 例: プログラムの実行例

5. C言語のコード例


1. はじめに

アナグラムとは、同じ文字で構成されるが順番が異なる2つの文字列のことを指します。例えば、「listen」と「silent」はアナグラムです。C言語では、これらの文字列がアナグラムであるかどうかを確認するためには、いくつかの方法があります。この記事では、その判定方法について詳しく解説します。

2. アナグラムとは

アナグラムとは、2つの文字列が持つ文字が同じで、その順番が異なる場合を指します。例えば、「triangle」と「integral」や、「evil」と「vile」などがアナグラムの例です。アナグラムであるかを判定するためには、以下の条件を満たす必要があります:

  • 両方の文字列に含まれる文字の数が同じであること
  • 各文字が同じ頻度で出現すること

3. アナグラム判定方法

アナグラムかどうかを判定するための方法としては、主に2つのアプローチがあります:

  • 文字列をソートして比較する方法
  • 文字の出現頻度をカウントして比較する方法
それぞれの方法について解説します。

文字列をソートして比較する方法

最も簡単な方法は、両方の文字列をソートして、その結果を比較する方法です。もしソートされた文字列が一致すれば、元の文字列はアナグラムであると言えます。この方法は、文字列の長さがnである場合、O(n log n)の計算時間がかかります。

文字の出現頻度をカウントして比較する方法

もう一つの方法は、文字列内の各文字が何回出現するかを数え、その頻度が一致するかどうかを比較する方法です。この方法では、文字列を1回走査するだけで済むため、計算量はO(n)になります。

4. 例: プログラムの実行例

以下にいくつかの例を挙げます。これらは、アナグラムかどうかを判定するプログラムの出力結果です。

  • 入力: “listen”, “silent” → 結果: アナグラムです
  • 入力: “evil”, “vile” → 結果: アナグラムです
  • 入力: “hello”, “world” → 結果: アナグラムではありません
  • 入力: “triangle”, “integral” → 結果: アナグラムです

5. C言語のコード例

以下に、C言語を使用したアナグラム判定プログラムのコードを示します。このプログラムは、文字列をソートして比較する方法を使用しています。

#include 
#include 
#include 

// ソート用の比較関数
int compare(const void *a, const void *b) {
    return (*(char*)a - *(char*)b);
}

int isAnagram(char str1[], char str2[]) {
    // 文字列の長さが異なればアナグラムではない
    if (strlen(str1) != strlen(str2)) {
        return 0;
    }

    // 文字列を小文字に変換
    for (int i = 0; str1[i]; i++) {
        str1[i] = tolower(str1[i]);
    }
    for (int i = 0; str2[i]; i++) {
        str2[i] = tolower(str2[i]);
    }

    // 文字列をソート
    qsort(str1, strlen(str1), sizeof(char), compare);
    qsort(str2, strlen(str2), sizeof(char), compare);

    // ソート後の文字列を比較
    return strcmp(str1, str2) == 0;
}

int main() {
    char str1[100], str2[100];

    printf("1つ目の文字列を入力: ");
    scanf("%s", str1);
    printf("2つ目の文字列を入力: ");
    scanf("%s", str2);

    if (isAnagram(str1, str2)) {
        printf("アナグラムです\n");
    } else {
        printf("アナグラムではありません\n");
    }

    return 0;
}
    

このプログラムでは、文字列を小文字に変換した後、qsort関数を使って文字列をソートします。その後、ソートされた文字列が一致するかどうかを比較して、アナグラムかどうかを判定しています。

このコードをコンパイルして実行することで、入力した2つの文字列がアナグラムかどうかを判定できます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です