2つの文字列がアナグラムかどうかを判定するJavaプログラムの書き方
この記事では、2つの文字列がアナグラム(anagram)であるかどうかを判定するJavaプログラムの作り方を解説します。
アナグラムとは?
アナグラムとは、ある単語やフレーズに含まれる文字を並べ替えることで作られる、別の単語やフレーズのことです。たとえば「Race」と「Care」は、使用されている文字とその個数が完全に一致しているため、アナグラムの関係にあると言えます。
判定の基本的な考え方は次のとおりです。ユーザーが入力した2つの文字列それぞれについて、各アルファベット(a〜z)が出現する回数(=出現頻度)を数えます。そして、両方の文字列で対応する文字の頻度がすべて一致していれば、その2つの文字列はアナグラムであると判断できます。
実行例
入力
Enter the first string : Race Enter the second string : Care
出力
The strings race and care are anagram.
判定アルゴリズム
処理の流れは以下の手順になります。
ステップ1 - 処理を開始する ステップ2 - 2つの文字列変数(my_string_1、my_string_2)を宣言する ステップ3 - ユーザーから値を読み込む、または値を直接定義する ステップ4 - toLowerCase()メソッドを使って、両方の文字列を小文字に変換する ステップ5 - 2つの文字列の長さを比較し、異なる場合はアナグラムではないと判定する ステップ6 - 文字列をchar型の配列に変換(toCharArray())し、それぞれをソートする ステップ7 - equals()メソッドで2つの配列を比較する。一致すればアナグラム、そうでなければアナグラムではない ステップ8 - 結果を表示する ステップ9 - 処理を終了する
ポイントは、大文字・小文字の違いをなくすために先に小文字へ統一しておくことです。これにより「Race」と「race」のような表記ゆれの影響を受けずに正しく比較できます。また、長さが異なる時点でアナグラムになり得ないため、早期に判定を終えることで無駄な処理を避けられます。
例1:ユーザーからの入力を受け付ける場合
ここでは、Scannerを使ってプロンプトに対してユーザーが入力した値を判定します。
import java.util.Scanner;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
System.out.println("Required packages have been imported");
String my_string_1, my_string_2;
Scanner my_scanner = new Scanner(System.in);
System.out.println("A reader object has been defined ");
System.out.print("Enter the first string : ");
my_string_1 = my_scanner.nextLine();
System.out.print("Enter the second string : ");
my_string_2 = my_scanner.nextLine();
my_string_1 = my_string_1.toLowerCase();
my_string_2 = my_string_2.toLowerCase();
if(my_string_1.length() == my_string_2.length()) {
char[] my_array_1 = my_string_1.toCharArray();
char[] my_array_2 = my_string_2.toCharArray();
Arrays.sort(my_array_1);
Arrays.sort(my_array_2);
boolean my_result = Arrays.equals(my_array_1, my_array_2);
if(my_result) {
System.out.println("The strings "+my_string_1 + " and " + my_string_2 + " are anagram.");
} else {
System.out.println("The strings "+my_string_1 + " and " + my_string_2 + " are not anagram.");
}
} else {
System.out.println("The strings "+my_string_1 + " and " + my_string_2 + " are not anagram.");
}
}
}出力
Required packages have been imported A reader object has been defined Enter the first string : Race Enter the second string : Care The strings race and care are anagram.
例2:文字列をあらかじめ定義しておく場合
今度は、文字列をプログラム内であらかじめ定義し、その値を使って判定を行う例です。動作確認やテストの際に便利な書き方です。
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
System.out.println("Required packages have been imported");
String my_string_1, my_string_2;
my_string_1 = "Race";
my_string_2 = "Care";
System.out.println("The two strings are defined as " +my_string_1 +" and " + my_string_2);
my_string_1 = my_string_1.toLowerCase();
my_string_2 = my_string_2.toLowerCase();
if(my_string_1.length() == my_string_2.length()) {
char[] my_array_1 = my_string_1.toCharArray();
char[] my_array_2 = my_string_2.toCharArray();
Arrays.sort(my_array_1);
Arrays.sort(my_array_2);
boolean my_result = Arrays.equals(my_array_1, my_array_2);
if(my_result) {
System.out.println("The strings "+my_string_1 + " and " + my_string_2 + " are anagram.");
} else {
System.out.println("The strings "+my_string_1 + " and " + my_string_2 + " are not anagram.");
}
} else {
System.out.println("The strings "+my_string_1 + " and " + my_string_2 + " are not anagram.");
}
}
}出力
Required packages have been imported The two strings are defined as Race and Care The strings race and care are anagram.
まとめ
2つの文字列がアナグラムかどうかの判定は、「小文字に統一 → 文字数の確認 → ソート → 比較」というシンプルな手順で実装できます。Arraysクラスのsort()とequals()を活用すれば、文字ごとの出現回数を自分で数えることなく、簡潔に判定ロジックを記述できるのが魅力です。ぜひ実際にコードを動かして、挙動を確かめてみてください。
-
Pythonで2つの文字列が0または1の編集距離にあるかどうかを判定する方法
2つの文字列 S と T が与えられたとき、それらが「編集距離0(完全に一致)」または「編集距離1」の関係にあるかどうかを判定する問題を考えてみましょう。ここでいう編集操作とは、文字の削除、文字の追加、文字の置換の3種類を指します。例えば、S = hello、T = hallo の場合、1文字だけ異なるため編集距離は1となり、出力は True になります。一方、S = abc、T = xyz のように複数箇所の変更が必要な場合は False を返します。アルゴリズムの考え方この問題は、両方の文字列を先頭から同時に走査しながら、不一致が見つかった回数をカウントするというシンプルなアプローチで解け
-
【Python】2つの数値の2進表現がアナグラムかどうかを判定するプログラム
2つの数値が与えられたとき、その2進表現同士がアナグラム(同じ文字を並べ替えたもの)になっているかどうかを判定します。Pythonでは、collectionsモジュールのCounterクラスと辞書の比較を組み合わせることで、この問題をシンプルかつ効率的に解くことができます。 実行例 入力: a = 8, b = 16 出力: Yes 両方の数値の2進表現は、0と1の個数が同一です。 アルゴリズム ステップ1 : 2つの数値を受け取ります。 ステップ2 : bin()関数で各数値を2進数の文字列に変換し、接頭辞「0b」に相当する先頭2文字を取り除きます。 ステップ3 : 2つの2進表現は