ゆるふわ競プロ

Javaでゆるゆる競プロしています.忘れっぽいのでメモ用,復習用

ABC098

ABC098B

AtCoder問題

考え方

考え方は全探査
全ての場所で区切って左右にある同じ文字を探します。今回は同じ種類の数を調べなくてはならないため、aa/aaで区切った時に重複して数えないことが大切。

コード

文字列の分割

        for (int i = 1; i < n; i++) {

            x = s.substring(0, i);

            y = s.substring(i);
        //適切なカウント処理
        }

String class のsubstringメソッドを使って左右に分割。nは与えられた文字の長さ。この時substringに渡す引数に注意が必要

   x = s.substring(int a , int b );

この時文字列 s の最初のn文字の添え字を 0 として a以上b未満 の文字列がx に代入される。
s = applepen の時 x = s.substring( 2 , 5 )とすると x は ple となる。

左右に含まれている種類を数える。

for (int j = 0; j < x.length(); j++) {
                if (y.contains(String.valueOf(x.charAt(j)))) {
                    if (j == 0) {

                        count++;
                    } else if (!(x.substring(0, j).contains(String.valueOf(x.charAt(j))))) {
                        count++;

                    }

                }
            }

適切なカウント処理のところに上の処理を入れます。

y.contains(String.valueOf(x.charAt(j)))この処理でx の j 番目の 文字が y に含まれているかどうかを見ます。j 番目より前のx に含まれている場合は処理を飛ばすようにしています。

一番多いカウントを取り出す

       ans[i - 1] = count;
       count = 0;
       Arrays.sort(ans);

それぞれのiの値を配列に入れていき、Arrays.sort( )で昇順に並び替えます。その後配列の一番後ろの数を取り出すことで最大値を出力することができる。

コメント

解放は意外と簡単に思いついた。 実装した時にエラー吐きまくりだった。 原因は引数の数字がうまく行かなかった。 substringの範囲やfor( )の初期値の値をうまく設定できなかったため失敗を繰り返した。
文字列の添え字や配列の番号は気をつけたい。