Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
1
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

@takepan

~ これだけ解けば十分闘える!過去問精選 10 問 ~ の9問目 Daydream をPHPで

はい、前の記事の続きです。

AtCoder に登録したら次にやること ~ これだけ解けば十分闘える!過去問精選 10 問 ~ から、9問目

与えられた文字列が、"dream", "dreamer", "erase", "eraser"を任意に組み合わせることで、できるか判定せよ。という問題。

はっきり言ってしまえば、もっと難しい組み合わせだったら、私は正解できないかもしれません。

こちらの問題の場合は、例えばdreamer…という文字列を先頭の方から見ると、

dream/er…
dreamer/…

どちらか分からないので探索することになります。
この手の問題は苦手です……

ただ、後ろから見れば最後の文字が drea m、eras e、dreame r、erase r でrが2つありますが、後ろから3文字目で見分けがつきますので、判定は可能です。

そんな訳で、4つの単語と末尾を比較して、一致したらどんどん削っていき、何も文字が残らなかったら YES 、何か残っていたら NO と出力するプログラムを書きました。

<?php
$words = ["dream", "dreamer", "erase", "eraser"];

fscanf(STDIN, "%s", $S);

while($S) {
    $flg = false;

    foreach ($words as $word) {
        $len = strlen($word);
        $exam = substr($S, -$len);
        if ($exam === $word) {
            $S = substr($S, 0, strlen($S) - $len);
            $flg = true;
            break;
        }
    }

    if ($flg === false) break;
}

echo $S === "" ? "YES\n" : "NO\n";

image.png

前からがダメなら、後ろから行けばいいじゃない?ということで。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
1
Help us understand the problem. What are the problem?