AtCoder ABC049C - 白昼夢 / Daydream
最近AtCoderをちょこちょこやってて、
なかなか閃かなかった問題がスッキリ解けたのでネタバレ。
問題文
英小文字からなる文字列 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
これ↑をみて、こう↓思った
なるほどなー。頭硬かったなあ。
— Ryo Ishimoto (@iryond) April 13, 2019
dreameraserが問題ならeraserから先消せばよかったのか。文字列反転してからループで評価してACしたけど、これはかなり負けた感ある。https://t.co/K6qKVE7QFa