C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#で組み込み関数を使わずに最初の一意な文字のインデックスを返す方法

概要

文字列の中で最初に一度だけ出現する文字(一意な文字)のインデックスを、C#の組み込み関数に頼らずに求める方法を解説します。

アルゴリズムの考え方

まず、長さ256の空の配列を新しく作成します。次に、文字列全体を1文字ずつ走査しながら、各文字の出現回数をこの配列に記録していきます。すべての文字を数え終えたら、もう一度文字列を先頭から走査し、カウントが「1」になっている最初の文字を見つけて、そのインデックスを返します。該当する文字が存在しない場合は -1 を返します。

例1

aabccd → 各文字の出現回数は a:2、b:1、c:2、d:1 → カウントが1の最初の文字は「b」です。したがって、b のインデックスである「2」が返されます。

例2:サンプルコード

using System;
namespace ConsoleApplication{
    public class Arrays{
        public int ReturnIndexOfFirstUniqueCharacter(string s){
            int index = -1;
            // 各文字の出現回数を記録するための配列
            int[] arrayValues = new int[256];
            // 1回目の走査:各文字の出現回数をカウント
            for (int i = 0; i < s.Length; i++){
                int value = s[i] - 'a';
                arrayValues[value] += 1;
            }
            // 2回目の走査:カウントが1の最初の文字を探す
            for (int i = 0; i < s.Length; i++){
                int value = s[i] - 'a';
                if (arrayValues[value] == 1){
                    index = i;
                    break;
                }
            }
            return index;
        }
    }
    class Program{
        static void Main(string[] args){
            Arrays a = new Arrays();
            Console.WriteLine(a.ReturnIndexOfFirstUniqueCharacter("bookisgreat"));
            Console.ReadLine();
        }
    }
}

出力結果

0

この例では、「bookisgreat」という文字列の中で最初に一度だけ出現する文字は「b」であり、そのインデックスは 0 であるため、結果として 0 が出力されます。

補足

この実装では、s[i] - 'a' という計算で文字を配列のインデックスに変換しているため、小文字の英字(a〜z)を対象とした文字列を前提としています。また、文字列を2回走査しますが、計算量は O(n)、使用する配列は固定長のためメモリ効率も良好です。大文字や記号なども扱いたい場合は、ASCIIコード全体をカバーできるよう配列サイズとオフセットの調整が必要になります。

  1. Pythonで文字列内の最初の繰り返し文字のインデックスを検索する方法

    文字列 s が与えられたとき、その中で最初に繰り返し出現する文字のインデックスを求める問題を考えてみましょう。繰り返し文字がひとつも存在しない場合は、-1 を返します。 例えば、入力が "abcade" の場合、出力は 3 になります。これは、文字 a がインデックス 3 の位置に再び現れているためです。 解法のアプローチ この問題を解くには、以下の手順に従います。 文字の出現履歴を記録するための辞書(マップ)chars を定義します。 i を 0 から文字列の長さまで順にループさせます。 s[i] がすでに chars に存在する場合、その時点のインデックス i を

  2. Pythonで文字列内の最初のユニーク文字を見つける方法

    文字列が与えられたとき、その中で最初に一度だけ出現する文字(ユニークな文字)を見つける問題を考えてみましょう。 例えば、文字列が people の場合、出現回数が1回である最初の文字は o です。この場合、そのインデックスである 2 を返します。もし該当する文字が文字列中に存在しない場合は、-1 を返します。 解法のアプローチ この問題は、以下の手順で効率的に解くことができます。 頻度マップ(辞書)を作成する 文字列内の各文字 c について処理を行う: c が頻度マップに存在しない場合は、キーとして追加し値を 1 に設定する すでに存在する場合は、そのカウントを +1 する 作成した頻