C言語のアナグラムとは?文字列判定の仕組みとサンプルコードを解説
アナグラム(Anagram)とは、2つの文字列に含まれるすべての文字が、同じ回数だけ出現し合っている関係にある文字列のことを指します。
本記事で紹介するプログラムでは、ユーザーが入力した2つの文字列に対して、それぞれのアルファベット(a〜z)が出現する回数を数え、対応する出現回数を比較します。ここでいう「出現頻度」とは、ある文字が文字列の中に何回現れるかを表すものです。
2つの文字列において、すべてのアルファベットの出現頻度が完全に一致していれば、それらの文字列はアナグラムであると判断できます。
例1:アナグラムとなるケース
文字列1 − abcd
文字列2 − bdac
これら2つの文字列には同じ文字がそれぞれ1回ずつ含まれているため、アナグラムです。
例2:アナグラムとならないケース
文字列1 − programming
文字列2 − gramming
出力 − The strings are not anagrams.(これらの文字列はアナグラムではありません)
C言語によるアナグラム判定プログラム
以下は、入力された2つの文字列がアナグラムかどうかを判定するC言語のサンプルプログラムです。
#include <stdio.h>
int check_anagram(char [], char []);
int main(){
char a[1000], b[1000];
printf("Enter two strings\n");
gets(a);
gets(b);
if (check_anagram(a, b))
printf("The strings are anagrams.\n");
else
printf("The strings aren't anagrams.\n");
return 0;
}
int check_anagram(char a[], char b[]){
int first[26] = {0}, second[26] = {0}, c=0;
// 1つ目の文字列の各文字の出現頻度を計算
while (a[c] != '\0') {
first[a[c]-'a']++;
c++;
}
c = 0;
while (b[c] != '\0') {
second[b[c]-'a']++;
c++;
}
// 文字の出現頻度を比較
for (c = 0; c < 26; c++)
if (first[c] != second[c])
return 0;
return 1;
}
プログラムのポイント
- 26個の要素を持つ配列 first と second を用意し、各アルファベット(a〜z)の出現回数をカウントします。
- a[c] - 'a' という計算によって、文字を 0〜25 のインデックスに変換しています。
- 最後に2つの配列を比較し、1つでも異なる値があれば 0(偽)を返して「アナグラムではない」と判断します。
実行結果
上記のプログラムを実行すると、以下のような出力が得られます。
Run 1: Enter two strings abcdef deabcf The strings are anagrams. Run 2: Enter two strings tutorials Point The strings aren't anagrams.
-
文字列とは何か?C言語での文字列の宣言と初期化方法を徹底解説
C言語における文字列(string)とは、複数の文字を並べた「文字の配列」、すなわち文字の集合体のことです。C言語には文字列型という専用のデータ型が存在しないため、char型の配列として文字列を扱います。 文字列の宣言 文字列は、以下の形式で宣言します。 char 文字列名 [サイズ]; たとえば char a[50]; と記述すると、最大50文字まで格納できる文字列が定義されます。なお、終端を表すヌル文字(\0)のぶんも領域が必要なため、実際に格納できるのは「サイズ − 1」文字である点に注意しましょう。 文字列の初期化 文字列の初期化には、主に次の2つの方法があります。 1. 単一文
-
C言語のstrcmp()関数とは?文字列比較の基本と使い方を徹底解説
C言語の標準ライブラリ関数 int strcmp(const char *str1, const char *str2) は、ポインタ str1 が指し示す文字列と、str2 が指し示す文字列を比較するための関数です。C言語において、文字型の配列は「文字列」と呼ばれます。まずは文字列の基本的な扱い方から確認していきましょう。文字列の宣言文字列(文字配列)の宣言は以下のように行います。char stringname [size];例えば、char string[50]; と宣言すれば、最大50文字の長さを持つ文字列を格納できます。文字列の初期化文字列の初期化には、主に次の2つの方法があります。1