解説つき!競ってわかる はじめてpythonプログラミング

競プロの情報発信と備忘録を兼ねている

ABC237C

ABC237C の解説

atcoder.jp


解答コード

https://atcoder.jp/contests/abc237/submissions/29052747

 

問題

文字列の先頭に,任意の数だけ'a'をつけることで,与えられた文字列を回文にできるかどうか判定する問題です.

 

解説

考え方は,4つのステップからなります.

  1. 文字列Sの先頭と語尾にいくつのaが連続しているか調べる
  2. 先頭にある連続したaの個数が語尾に連続するaの個数以下である
  3. Sの先頭と語尾にある連続するaを除く
  4. 残った文字列Sが回文か調べ,回文であれば題意を満たす

概要は下図.

f:id:nodashin_jpn:20220205170418j:plain

ABC237C_overview

 

まず,文字列Sについて回文かどうかの判定をする関数を作成します.
回文かどうかということは,文字列を逆順にしても同じであることを意味します.
厳密には,文字列の半分の長さまでを判定すればよいです.

def is_palindrome(s):
    """回文かどうか判定"""
    return s == s[::-1]

 

標準入力を読み込みます.

S = input()


文字の先頭と語尾のaの長さを数えます.

right_len_a = len(S) - len(S.rstrip('a'))
left_len_a = len(S) - len(S.lstrip('a'))

 

もし,語尾(右側)のaの長さが先頭(左側)より短い場合は,題意を満たしません.
なぜなら,aを追加できるのは先頭だけだからです.

さらに,先頭にあるaと語尾のaを除いた残りのブロックが回文である必要があります.

if right_len_a >= left_len_a and is_palindrome(S.strip('a')):
    ans = 'Yes'
else:
    ans = 'No'
print(ans)

 

以上,ABC237Cの解法でした.

 

コメント,ブックマークよろしくお願いします!!