ホーム AtCoder ABC 237 C — kasaka
記事
キャンセル

AtCoder ABC 237 C — kasaka

問題: AtCoder ABC 237 C — kasaka English · 한국어 · [日本語]

操作でできるのは文字列の先頭に a を追加することだけなので、末尾の文字は変えられません。先頭に連続する a の個数を leadingA、末尾に連続する a の個数を trailingA とします。leadingA > trailingA なら、先頭にある a と対応する末尾の a が足りないため、回文にはできません。

そうでなければ、先頭に trailingA - leadingA 個の a を追加すれば、両端の連続する a の数をそろえられます。すると、先頭と末尾の a の並びを除いた中央部分は、もともと回文でなければなりません。両端の a を飛ばし、残った部分を両側からポインタで比較します。ポインタが交差した場合、中央部分は空か1文字なので回文です。

すべての文字が a の場合(中央部分が空の場合)も、両端に a がない場合(文字列全体を調べる場合)もこの処理で判定できます。時間計算量は O(|S|)、追加の空間計算量は O(1) です。

Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
        String s = input.readLine();

        int left = 0;
        while (left < s.length() && s.charAt(left) == 'a') {
            left++;
        }

        int right = s.length() - 1;
        while (right >= 0 && s.charAt(right) == 'a') {
            right--;
        }

        int leadingA = left;
        int trailingA = s.length() - 1 - right;
        if (leadingA > trailingA) {
            System.out.println("No");
            return;
        }

        while (left < right) {
            if (s.charAt(left) != s.charAt(right)) {
                System.out.println("No");
                return;
            }
            left++;
            right--;
        }
        System.out.println("Yes");
    }
}
この記事は著者により CC BY 4.0 ライセンスで公開されています。