C#で指定された文字列がヘテログラムかどうかを判定する方法
ヘテログラムとは?
ヘテログラム(Heterogram)とは、同じ文字が2回以上現れない文字列のことです。つまり、構成するすべての文字が一意である文字列を指します。
例えば、以下のような単語はヘテログラムです。
Mobile Cry Laptop
これらの単語には重複した文字が含まれていません。一方、「banana」や「apple」のように同じ文字が複数回出現する文字列は、ヘテログラムではありません。
判定ロジックの考え方
判定には、アルファベット26文字分の出現フラグを格納する整数型配列を使用します。文字列の長さ分だけループ処理を行い、各文字に対応する配列要素をチェックしていきます。まだ出現していない文字であればフラグを立て、すでに出現済みの文字であればその時点で false を返します。
for (int i = 0; i < len; i++) {
if (val[str[i] - 'a'] == 0)
val[str[i] - 'a'] = 1;
else
return false;
}ここで len は入力文字列の長さです。str[i] - 'a' という計算により、各文字を配列のインデックス(0~25)へ変換しています。
C#による完全なサンプルコード
using System;
public class GFG {
static bool checkHeterogram(string str, int len) {
int []val = new int[26];
for (int i = 0; i < len; i++) {
if (val[str[i] - 'a'] == 0)
val[str[i] - 'a'] = 1;
else
return false;
}
return true;
}
public static void Main () {
string str = "mobile";
// 入力文字列の長さを取得
int len = str.Length;
if(checkHeterogram(str, len))
Console.WriteLine("String is Heterogram!");
else
Console.WriteLine("String is not a Heterogram!");
}
}
実行結果
String is Heterogram!
処理のポイント
- 時間計算量: 文字列を1度だけ走査するため O(n) で効率的です。
- 空間計算量: サイズ26の固定長配列のみを使用するため O(1) です。
- 注意点: この実装は小文字の英字のみを想定しています。大文字や記号・空白が含まれる可能性がある場合は、
ToLower()などで事前に正規化してから判定すると安全です。
-
Pythonで与えられたグラフが2部グラフかどうかを判定するプログラム
2部グラフとは無向グラフが与えられたとき、そのグラフが2部グラフ(バイパータイトグラフ)であるかどうかを判定する方法を解説します。2部グラフとは、グラフのすべての頂点を2つの集合 A と B に分割でき、グラフ内のすべての辺 {u, v} が必ず一方の端点 u が集合 A、もう一方の端点 v が集合 B に属するようなグラフのことです。つまり、同じ集合内の頂点同士を結ぶ辺(A-A や B-B)が一切存在しないグラフです。例として、次のようなグラフを考えてみましょう。この場合、頂点 [0, 4] を集合 A に、[1, 2, 3] を集合 B に分類できます。すべての辺は A から B、または
-
指定された文字列がキーワードであるかどうかを確認するPythonプログラム
この記事では、指定された文字列がPythonのキーワード(予約語)であるかどうかを判定する方法について解説します。問題の概要与えられた文字列が、Pythonにおけるキーワードであるかどうかを確認する必要があります。キーワードとは、言語によって特別な用途のために予約されている単語であり、変数名や関数名などの識別子として使用することはできません。例えば「if」「for」「while」「def」などはすべてキーワードです。これらの名前を変数に使おうとすると、構文エラーが発生します。解決策:keywordモジュールの活用Pythonには標準ライブラリとしてkeywordモジュールが用意されており、これ