C#で組み込みメソッドを使わずに文字列の最初の一意の文字を取得する方法
文字列の中で一度だけ出現する文字(一意の文字)のうち、最も早く現れるものを探すアルゴリズムは、面接やコーディングテストでよく出題される定番問題です。ここでは、C#の組み込みメソッド(IndexOf や Count など)に頼らず、基本的な配列操作だけで実装する方法を紹介します。
アルゴリズムの考え方
まず、長さ256の新しい空の配列を作成します。これは英数字などの文字コード(ASCII値)をインデックスとして扱うためです。次に、対象の文字列を先頭から1文字ずつ走査し、各文字に対応する配列の要素の値をインクリメントしていくことで、それぞれの文字の出現回数を記録します。
すべての文字のカウントが完了したら、再度文字列を先頭から走査し、カウントが「1」となっている最初の文字を見つけて返します。これにより、時間計算量 O(n) で効率的に一意の文字を特定できます。
例1
文字列「aabccd」の場合、各文字の出現回数は a=2、b=1、c=2、d=1 となるため、カウント列は「2 1 2 1」になります。各文字からASCII値('a')を差し引いてインデックスを求めながら走査すると、カウントが1である最初の文字は「b」であることがわかります。
例2:C#での実装コード
using System;
namespace ConsoleApplication{
public class Arrays{
public char ReturnCharacterOfFirstUniqueCharachter(string s){
int index = -1;
int[] arrayValues = new int[256];
for (int i = 0; i < s.Length; i++){
int value = s[i] - 'a';
arrayValues[value] += 1;
}
for (int i = 0; i < s.Length; i++){
int value = s[i] - 'a';
if (arrayValues[value] == 1){
index = i;
break;
}
}
return s[index];
}
}
class Program{
static void Main(string[] args){
Arrays a = new Arrays();
Console.WriteLine(a.ReturnCharacterOfFirstUniqueCharachter("bbookisgreat"));
Console.ReadLine();
}
}
}このコードでは、まず1周目のループで各文字の出現回数を配列に記録し、2周目のループで出現回数が1の文字が見つかった時点でそのインデックスを保存して処理を終了しています。
出力結果
k
入力文字列「bbookisgreat」の場合、b と o は2回ずつ出現するため一意ではなく、3番目に出現する「k」が最初の一意の文字として返されます。
-
Javaで文字列に特定の文字が含まれているか確認する方法
Javaでは、文字列の中に指定した文字が含まれているかどうかを、いくつかの方法で簡単に確認できます。本記事では、代表的な2つの方法である indexOf() メソッドと toCharArray() メソッドを使った文字検索の手法を、サンプルコード付きでわかりやすく解説します。 indexOf() メソッドを使う方法 Stringクラスの indexOf() メソッドを使うと、文字列の中から特定の文字を検索できます。このメソッドは、引数として渡した文字が文字列内で最初に出現する位置(インデックス)を int 型で返します。もし指定した文字が文字列中に存在しない場合は、-1 を返します。 したがっ
-
Pythonで文字列内の最初のユニーク文字を見つける方法
文字列が与えられたとき、その中で最初に一度だけ出現する文字(ユニークな文字)を見つける問題を考えてみましょう。 例えば、文字列が people の場合、出現回数が1回である最初の文字は o です。この場合、そのインデックスである 2 を返します。もし該当する文字が文字列中に存在しない場合は、-1 を返します。 解法のアプローチ この問題は、以下の手順で効率的に解くことができます。 頻度マップ(辞書)を作成する 文字列内の各文字 c について処理を行う: c が頻度マップに存在しない場合は、キーとして追加し値を 1 に設定する すでに存在する場合は、そのカウントを +1 する 作成した頻