C#で文字列内の各文字の出現回数をカウントする方法
C#では、文字列に含まれる各文字が何回出現するかを簡単に調べることができます。この記事では、配列を使って文字の出現回数を効率的にカウントするプログラムを紹介します。
基本的な考え方
まず、対象となる文字列を用意します。
String s = "mynameistomhanks";
次に、文字ごとの出現回数を記録するためのint型の配列を作成します。ASCIIコードは256種類あるため、サイズ256の配列を用意すると、すべての半角文字に対応できます。
そして、文字列とこの配列を専用のメソッドに渡し、文字列を1文字ずつ走査しながら出現回数をカウントします。
カウント用メソッドの実装
以下のメソッドでは、文字列の各文字をインデックスとして扱い、対応する配列要素をインクリメントすることで出現回数を数えています。
static void calculate(String s, int[] cal) {
for (int i = 0; i < s.Length; i++)
cal[s[i]]++;
}
char型は暗黙的にint型へ変換されるため、s[i]をそのまま配列のインデックスとして使用できるのがポイントです。
完全なサンプルコード
ここまでの内容をまとめた完全なプログラムがこちらです。
using System;
class Demo {
static int maxCHARS = 256;
static void calculate(String s, int[] cal) {
for (int i = 0; i < s.Length; i++)
cal[s[i]]++;
}
public static void Main() {
String s = "mynameistomhanks";
int[] cal = new int[maxCHARS];
calculate(s, cal);
for (int i = 0; i < maxCHARS; i++) {
if (cal[i] > 1) {
Console.WriteLine("Character " + (char) i);
Console.WriteLine("Occurrence = " + cal[i] + " times");
}
if (cal[i] == 1) {
Console.WriteLine("Character " + (char) i);
Console.WriteLine("Occurrence = " + cal[i] + " time");
}
}
}
}
このプログラムでは、Mainメソッド内で文字列を定義した後、calculateメソッドを呼び出してカウントを行い、最後に結果を出力しています。出現回数が2回以上の場合は「times」、1回のみの場合は「time」と表示が切り替わる点にも注目してください。
実行結果
上記のプログラムを実行すると、次のような出力が得られます。
Character a Occurrence = 2 times Character e Occurrence = 1 time Character h Occurrence = 1 time Character i Occurrence = 1 time Character k Occurrence = 1 time Character m Occurrence = 3 times Character n Occurrence = 2 times Character o Occurrence = 1 time Character s Occurrence = 2 times Character t Occurrence = 1 time Character y Occurrence = 1 time
このように、「m」が3回、「a」「n」「s」がそれぞれ2回、その他の文字が1回出現していることが一目でわかります。
まとめ
サイズ256のint型配列をカウンターとして使うことで、文字列内の全文字の出現回数をO(n)の計算量で効率的に集計できます。シンプルながら実用的なテクニックなので、文字列解析やログ処理など、さまざまな場面で応用できます。
-
Pythonで文字列内の異なる整数の個数を求めるプログラム
問題概要小文字の英数字から構成される文字列 s が与えられたとします。文字列中のすべての数字以外の文字を空白に置き換えると、少なくとも1つの空白で区切られた複数の整数が残ります。この置換操作を行った後、s に含まれる「異なる整数」の個数を求めるのが本問題です。ここで、2つの数値が「異なる」とみなされる条件は、先頭のゼロを取り除いた10進表現が互いに異なることです。具体例入力が s = ab12fg012th5er67 の場合、出力は 3 になります。理由を見てみましょう。置換後の文字列には [12, 012, 5, 67] という4つの数値が含まれます。12 と 012 は文字列としては別物で
-
復号化した文字列のk番目の文字を求める方法 – Pythonでの実装
問題の概要 エンコードされた文字列では、部分文字列の繰り返しが「部分文字列+出現回数」の形式で表現されます。たとえば、文字列が pq2rs2 で k=5 の場合、復号化後の文字列は pqpqrsrs となり、5番目の文字は r です。 ここで注意したいのは、出現回数が2桁以上になるケースも存在するという点です。たとえば a12b のような入力では、「a」が12回繰り返されることを正しく読み取れる必要があります。 具体例 入力として string = pq4r2ts3、k = 11 が与えられた場合を考えてみましょう。復号化後の文字列は pqpqpqpqrrtststs となるため、11番目の