C#で2つの文字列がアナグラム(Anagram)かどうかを判定する方法
「アナグラム」とは、ある文字列に含まれるすべての文字が、別の文字列にも同じだけ含まれている状態を指します。文字の出現順序は異なっていても構いません。たとえば「silent」と「listen」は、同じ文字で構成されているため互いにアナグラムです。
ここでは、次の2つの文字列がアナグラムであるかどうかをC#で確認する手順を見ていきましょう。
string str1 = "silent"; string str2 = "listen";
アナグラム判定の基本的な考え方
最もシンプルで分かりやすい方法は、両方の文字列をソートして比較することです。アナグラムであれば、文字を並べ替えた結果は必ず一致するためです。処理の手順は以下の通りです。
ステップ1:文字列を文字配列に変換する
まず、大文字・小文字の違いによる誤判定を防ぐため、ToLower()で小文字に統一してからToCharArray()で文字配列に変換します。
char[] ch1 = str1.ToLower().ToCharArray(); char[] ch2 = str2.ToLower().ToCharArray();
ステップ2:文字配列をソートする
Array.Sort()メソッドを使って、それぞれの文字配列を昇順に並べ替えます。
Array.Sort(ch1); Array.Sort(ch2);
ステップ3:ソート後の配列を文字列に戻す
ソートされた文字配列を、new string()コンストラクタで再び文字列に変換します。
string val1 = new string(ch1); string val2 = new string(ch2);
ステップ4:2つの文字列を比較する
最後に、2つの文字列が等しいかどうかを比較します。完全に一致していれば、元の文字列同士はアナグラムであると判断できます。
サンプルコード
上記の手順を実装した完全なコード例は以下の通りです。
using System;
public class Demo {
public static void Main () {
string str1 = "silent";
string str2 = "listen";
char[] ch1 = str1.ToLower().ToCharArray();
char[] ch2 = str2.ToLower().ToCharArray();
Array.Sort(ch1);
Array.Sort(ch2);
string val1 = new string(ch1);
string val2 = new string(ch2);
if (val1 == val2) {
Console.WriteLine("Both the strings are Anagrams");
} else {
Console.WriteLine("Both the strings are not Anagrams");
}
}
}実行結果
Both the strings are Anagrams
補足:より効率的な判定方法
ソートを使う方法は直感的ですが、計算量はO(n log n)となります。文字種が限られている場合(英小文字のみなど)は、各文字の出現回数を配列でカウントして比較する方法(計算量O(n))の方が高速です。また、長さが異なる文字列は絶対にアナグラムにならないため、事前にstr1.Length != str2.Lengthのチェックを入れておくと、無駄な処理を省けます。
-
Pythonで2つの数(m, n)が友愛数かどうかを判定する方法
友愛数とは? 友愛数(アミカブル数)とは、互いに異なる2つの整数のうち、一方の数の真の約数の総和がもう一方の数と一致し、その逆も同様に成り立つような数のペアを指します。 ここでいう真の約数とは、その数自身を除いた正の約数のことです。たとえば、6の真の約数は 1、2、3 となります。 最も有名な例が (220, 284) のペアです。 220 の真の約数:1, 2, 4, 5, 10, 11, 20, 22, 44, 55, 110 → 合計は 284 284 の真の約数:1, 2, 4, 71, 142 → 合計は 220 Pythonで友愛数を判定するコード Pythonでは、各数につい
-
Pythonの正規表現(reモジュール)で2つの文字列を比較する方法
Pythonでは、標準ライブラリのreモジュールを利用することで、正規表現による文字列の比較や照合を簡単に行えます。最も一般的な方法は、re.search()関数を使って、一方の文字列(パターン)がもう一方の文字列の中に存在するかどうかを調べるアプローチです。 re.search()を使った比較の基本例 以下のコードでは、文字列s1を正規表現パターンとして扱い、それが文字列s2内にマッチするかどうかを判定しています。 import re s1 = Pink Forest s2 = Pink Forrest if bool(re.search(s1, s2)) == True: pr