手芸王 [AtCoder Beginner Contest 023 B]
与えられた文字列が、指定の手順で作られたかどうか判定する問題です。
手順は、まず "b" を初期文字列として設定し、その後、
・両端に "a" と "c" を付ける
・両端に "c" と "a" を付ける
・両端に "b" と "b" を付ける
・以下、この繰り返し
となっています。
手順を検証する前に、例外を除外します。
上記の手順によって作られた文字列は、その長さが必ず奇数になるので、n が偶数なら -1 を出力します。また、中央の文字は必ず "b" であるはずなので、それ以外の文字だった場合は -1 を出力します。
void solve () { int n = nextInt(); if (n%2 == 0) { out.println(-1); return; } String s = next(); if (s.charAt(n/2) != 'b') { out.println(-1); return; } for (int i=0; i<n/2; i++) { if (i%3 == 0) { if (s.charAt(n/2-i-1)!='a' || s.charAt(n/2+i+1)!='c') { out.println(-1); return; } } else if (i%3 == 1) { if (s.charAt(n/2-i-1)!='c' || s.charAt(n/2+i+1)!='a') { out.println(-1); return; } } else if (i%3 == 2) { if (s.charAt(n/2-i-1)!='b' || s.charAt(n/2+i+1)!='b') { return; } } } out.println(n/2); }
中央の文字列から外側へ向かって、手順通りになっているかどうか n/2 回検証します。
・s.charAt(n/2-i-1), s.charAt(n/2+i+1)
この2つが「内側から i 番目にある文字列」を指しますが、添え字を考えるのが難しかったです。