AtCoder Begibbers Selection ABC049C - 白昼夢 備忘録
ABC049C - 白昼夢
問題はこちら
AtCoder Beginner Selection ABC049C - 白昼夢
解答
<?php
$s = trim(fgets(STDIN));
// 使用できる文字列
$wards = ["dream", "dreamer", "erase", "eraser"];
while(strlen($s) > 0){
$matched = false;
foreach($wards as $word){
// sの末尾がwordで終わっているかのチェック
if(substr($s, -strlen($word)) == $word){
// 一致するならsからその部分を削除
$s = substr($s, 0, -strlen($word));
$matched = true;
break;
}
}
// どの単語も一致しなければ終了
if(!$matched){
break;
}
}
echo (strlen($s) == 0) ? "YES\n" : "NO\n";
つまづきポイント
- 照合する回数が決まっているためwhileを使うという発想は出たがやり方が出てこなかった
- 末尾のみ違う単語があるため、先頭の文字列から照合していくと結論に違いが出てくる考えはまったく気づかなかった
- 標準入力から単語を削除していく発想は出たがやり方がわからなかった
考察とポイント
文字列(string)の先頭からN文字を削除するには、2つの引数を使います。
まず、substr()を呼び出します。
そして、substr()の第1引数に対象の文字列、第2引数に削除する文字数を指定します。
//text=対象の文字列, n=削除する文字数
$result = substr(text, n);
今回は最後尾から文字数をカウントして削除するため-(マイナス)を使っています。
また文字数は要素によって違うため、配列と変数を使用して文字数を指定しています。
// $sは文字列、$wordは文字列の変数
$s = substr($s, 0, -strlen($word));
offset指定による違い
// $sは文字列、$wordは文字列の変数
$s = substr($s, 0, -strlen($word));
と
// $sは文字列、$wordは文字列の変数
$s = substr($s, -strlen($word));
の違い
substr(string
substr(
substr(
つまり、これらの呼び出しは異なる結果をもたらします:
substr(
substr(
これらの違いは、文字列のどの部分を取り出すかという点で重要です。最初のコードは文字列の末專から
Discussion