AtCoder ABC049C - 白昼夢 / Daydream

最近AtCoderをちょこちょこやってて、
なかなか閃かなかった問題がスッキリ解けたのでネタバレ。

atcoder.jp

問題文

英小文字からなる文字列 S が与えられます。 T が空文字列である状態から始め、以下の操作を好きな回数繰り返すことで S=T とすることができるか判定してください。

  • T の末尾に dream , dreamer , erase , eraser のいずれかを追加する。

ポイント

Sが dreameraser である場合は、
先頭の5文字を dream ,後半の6文字を eraser と判定するのが正しいが、
先頭の7文字で dreamer と判定してしまうと、後半の判定が誤りとなる。

また、Sが dreamererase の場合は、
先頭の7文字を dreamer ,後半の5文字を erase と判定するのが正しいが、
先頭の5文字で dream と判定してしまうと、後半の判定が誤りとなる。

そのため、いい感じに判定する必要がある。
最初はキーワードを2つずつ判定するか?いやでもな…など色々考えていたが、これ文字列反転させれば簡単に解けんじゃね?というヒラメキが起き、書いてみたらACしたのでとても嬉しかった。

コード

input_str=input()
d='dream'
dr='dreamer'
e='erase'
er='eraser'

input_str = input_str[::-1]
d = d[::-1]
dr = dr[::-1]
e = e[::-1]
er = er[::-1]
s_str=''

while True:
#  print("s_str:"+s_str)
#  print("input_str:"+input_str)

  if(input_str==s_str):
    print('YES')
    exit()
  elif(input_str.startswith(s_str+d)):
    keyword=d
  elif(input_str.startswith(s_str+dr)):
    keyword=dr
  elif(input_str.startswith(s_str+e)):
    keyword=e
  elif(input_str.startswith(s_str+er)):
    keyword=er
  else:
    print('NO')
    exit()
  s_str = s_str+keyword

全ての文字列を反転 [::-1] させて、キーワードを1つずつマッチングさせている。

正攻法じゃないかもしれないが、すっきり書けたと思うので良しとする。

あとがき

書いたけど結局先に書いた人のほうがクオリティ高いし、、もうどうでもいっかーってなったのでもうどうでもいっかーってなった · GitHub

これ↑をみて、こう↓思った