torus711 のアレ

主に競技プログラミングの問題について書きます.PC 以外だと数式が表示されないかもしれないです

TopCoder, SRM 635, Division 2, Level 1 : IdentifyingWood

問題概要

 二つの文字列 s, t が与えられる。st を部分列として含むか否か、求めよ。

解法

 t に含まれるある文字にマッチさせられる s の文字が複数あるとき、より手前にある文字にマッチさせた方が、後で使える文字が多くなるため有利になります。従って、t の各文字について、s の未使用区間の内最も手前にある同じ文字に対応させることを繰り返すアルゴリズムで最適な戦略をシミュレートできます。このアルゴリズムで、t の全ての文字をマッチさせることができるか否かで、問題の答えを判定できます。
 実装に於いては、t を何文字処理し終わったかを記憶しながら、s を先頭から走査して、走査中、着目している t の文字と同じ文字を見つけたら、t に関するインデックスを一つ増やしていくように実装すると楽に書けると思います。

コード

#define FOR( e, c ) for ( auto &e : c )

class IdentifyingWood
{
public:
	string check( string s, string t )
	{
		const int L = t.size();

		int p = 0;
		FOR( c, s )
		{
			p += p < L && t[p] == c;
		}
		return p == L ? "Yep, it's wood." : "Nope.";
	}
};