【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つの文字列がアナグラムかどうかを判定できます。