C#で2つの文字列がアナグラム(アナグラム判定)かどうかを判断するプログラム
アナグラムとは、別の文字列に最初の文字列と同じ文字がすべて含まれており、文字の並び順だけが異なる関係のことです。例えば「listen」と「silent」のように、使用する文字が同一で順序が違う2つの単語は互いにアナグラムであると言えます。
ここでは、次の2つの文字列がアナグラムかどうかを判定してみましょう。
string str1 = "heater"; string str2 = "reheat";
判定の手順
まず、両方の文字列を小文字に変換し、文字配列(char配列)へ変換します。大文字・小文字の違いによる誤判定を防ぐために、ToLower()メソッドを使用します。
char[] ch1 = str1.ToLower().ToCharArray(); char[] ch2 = str2.ToLower().ToCharArray();
次に、Array.Sort()メソッドを使って、それぞれの文字配列を昇順にソートします。アナグラムであれば、ソート後の文字の並びは完全に一致するはずです。
Array.Sort(ch1); Array.Sort(ch2);
ソート後、文字配列を再び文字列に戻して比較します。以下が完全なサンプルコードです。
サンプルコード
using System;
public class Demo {
public static void Main () {
string str1 = "heater";
string str2 = "reheat";
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
このように、文字列を小文字化してソートした上で比較するというシンプルな手法により、2つの文字列がアナグラムであるかどうかを簡単に判定できます。計算量はソートに依存し、O(n log n)となります。文字数が非常に多い場合は、各文字の出現回数をカウントして比較するO(n)の手法も検討するとよいでしょう。
-
Pythonで2つの文字列がアナグラムかどうかを判定する方法
はじめに2つの文字列 s と t が与えられたとき、それらが互いのアナグラム(同じ文字を並べ替えて作られる関係)であるかどうかを判定する方法を解説します。例えば、s = bite、t = biet という入力の場合、両方とも同じ文字で構成されているため、出力は True になります。解決の手順この問題は以下のステップで解決できます。まず、s と t の文字数が一致しているか確認します。一致していなければ、その時点で False を返します。次に、s と t のそれぞれの文字をソートします。最後に、ソート後の s と t が完全に一致すれば True、そうでなければ False を返します。実装
-
【Python】2つの文字列を共通の位置で分割して回文を作れるか判定するプログラム
問題の概要同じ長さの2つの文字列 S と T が与えられたとき、両方の文字列を共通の位置で切断し、S の前半部分と T の後半部分をつなぎ合わせて回文(前から読んでも後ろから読んでも同じになる文字列)を作ることができるかどうかを判定します。例えば、入力が S = cat、T = dac の場合、出力は True になります。文字列を「c」+「at」と「d」+「ac」に分割すると、「c」+「ac」(つまり cac)が回文になるためです。アルゴリズムの手順この問題を解くためには、以下の手順に従います。n := 文字列 a の長さi := 0i < n かつ a[i] が b[n-i-1] と