たくあんポリポリ

勉強したことを載せていきます。最近、技術系の記事はZennに書いています。(https://zenn.dev/chittai)

【C#】文字列で、指定した文字が最初に出現するインデックス、最後に出現するインデックスを取得する方法

ABC053 Bで、掲題の方法を知ったのでメモを残します。

atcoder.jp

問題の概要

  • 文字列Sが与えられる
  • 先頭がAで末尾がZとなるような部分文字列の最大の長さを求める

解き方

最初はこう解きました。まず文字列Sを最初から確認し、Aがあった時にそのインデックスをaに格納します。その後、Zを見つけたら、ZのインデックスからAのインデックスの値を引いて部分文字列の長さを求めています。文字列最後までみるので、Zの後ろにさらにZがあったら、値は更新されます。

for (int i = 0; i < s.Length; i++)
{
    if (s[i] == 'A' && isFirst) { a = i; isFirst = false; }
    if (s[i] == 'Z') { count = (i - a) + 1; }
}

でも、これめんどくさいので、下記の方法をとると一発で求められます。

s.LastIndexOf('Z') - s.IndexOf('A') + 1);

LastIndexOf を使用すると、最後に値が出現したインデックスの値を取得できます。 docs.microsoft.com

例です。

string s = AKRGZKRRSZKEDRK
Console.WriteLine(s.LastIndexOf('Z'));
9

このように。Zが複数あっても、最後に出現した時のインデックスを返しています。

IndexOfは逆で 、最初に出現した時のインデックスを返します。 docs.microsoft.com

string s = AKRGZKRRSZKEDRK
Console.WriteLine(s.IndexOf('A'));
0

このようになります。この方法をつかうと、ABC053Bは簡単に解くことができます。