自信満々に書いたコードの評価が MLEだった話

はぁ...

ブログ用に始めて解いた問題でMLEが出たので報告します。

問題

ABC049C - 白昼夢 / Daydream

問題文

https://atcoder.jp/contests/abs/tasks/arc065_a

解決方針

  1. 文字列を左から5文字見て "dream","erase" かを確かめる
  2. それぞれ"dreamer","eraser" にならないかを確かめる
  3. "dreamer"が検出された場合"dreamerase", "dreameraser" になるかもしれないのでそれも確かめる
  4. 文字列を最後まで見終わったら結果を出力

当時これでいけるだろうとたかをくくっていた

感想

正直どこが原因なのか分かってないので再度考え直します。

コードをチェックしてくれた友人が"TLE"起きなさそうだしとかいってたら"MLE"が出たので、 もしかしたらやまこーさんはフラグ回収能力が高いのかもしrフラグ回収能力が高いのかもしれない(?)

解決したらまたブログ更新します。バイバイ(下におまけのコードがあるよ)

実際のコード

import java.util.Scanner;
public class Main {
    static String T = "";

    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        String str = sc.next();
        String[] strs = str.split("");
        for(int i = 0; i < strs.length;){
           if(checkDream(i,strs) != "error"){
               T += checkDream(i,strs);
           }else if(checkErase(i,strs) != "error"){
               T += checkErase(i,strs);
           }else{
               System.out.println("NO");
               return;
           }

           i = T.length();
        }
        if(T.equals(str)){
            System.out.println("YES");
        }else{
            System.out.println("NO");
        }
    }
    public static String checkDream(int index, String[] strs){
        String temp = "";
        try{
            for(int i = index; i < index + 5;i++){
                temp = temp + strs[i];
            }
            if(temp.equals("dream")){
                temp += strs[index + 5] + strs[index + 6];
                if(temp.equals("dreamer")){
                    if(checkErase(index + 5,strs) != "error"){
                        return "dream" + checkErase(index + 5,strs);
                    }else{
                        return "dreamer";
                    }
                }else{
                    return "dream";
                }
            }else{
                return "error";
            }
        }catch(Exception e){
            if(!temp.equals("dream")){
                return "error";
            }else{
                return "dream";
            }
        }


    }

    public static String checkErase(int index, String[] strs){
        String temp = "";
        try{
            for(int i = index; i < index + 5;i++){
                temp = temp + strs[i];
            }
            if(temp.equals("erase")){
                temp += strs[index + 5];
                if(temp.equals("eraser")){
                    return "eraser";
                }else{
                    return "erase";
                }
            }else{
                return "error";
            }
        }catch(Exception e){
            if(!temp.equals("erase")){
                return "error";
            }else{
                return "error";
            }
        }


    }

}