後ろから比較すれば、dream は確実に dream だし、erase は確実に erase。
比較する範囲を前にスライドしていく際には、ReadOnlySpan<char>
を使った。
余計な string のインスタンスが生成されるのを回避し、速度と読みやすさを両立できたのでは。
using System; namespace ABC049C { class Program { static void Main(string[] args) { const string dream = "dream"; const string dreamer = "dreamer"; const string erase = "erase"; const string eraser = "eraser"; var answer = "YES"; var s = Console.ReadLine().AsSpan(); while (s.Length != 0) { if (s.EndsWith(dream)) { s = s.Slice(0, s.Length - dream.Length); } else if (s.EndsWith(dreamer)) { s = s.Slice(0, s.Length - dreamer.Length); } else if (s.EndsWith(erase)) { s = s.Slice(0, s.Length - erase.Length); } else if (s.EndsWith(eraser)) { s = s.Slice(0, s.Length - eraser.Length); } else { answer = "NO"; break; } } Console.WriteLine(answer); } } }