#背景
競プロやpaizaのスキルチェック問題などをやる中で、比較的出題率の高い問題(気のせい?)の「文字列Aの中に文字列Bが入ってるかを判定するプログラム」はこのアルゴリズムで解く!というのが無かったので備忘録として残しておこうと思います。
#前提
find関数を利用します。文字の比較にはcompare関数もありますが、compare関数が二つの文字列を比較してどれだけ離れているかを返すのに対し、find関数では二つの文字列を比較してその文字が含まれていればその位置を返すという文字が含まれていることを前提としているため、使いやすいと考えました。
(compare関数でも文字列の一部を使って比較することができるので、二つの文字列の離れている距離が0という結果を返せば使用できると思います。)
#find関数の仕様
find関数は、stringクラスの関数で指定した文字列が先頭から検索してどこにあるのかを調べるために使います。指定した文字列が見つからなかった場合にはnposという値を返します。このnposは見つからなかったことを表し、数値的には「-1」となります。
【C++入門】文字列を検索するfind関数(全検索、正規表現)
比較して見つかればその場所の数値を、見つからなければnpos(=-1)を返すというわけです。
⇒今回は見つかった場所の数字はどうでも良いので、返り値がnposであればfalse、それ以外であればtrueが返ってくることだけを利用します。
#実装
実装は単純で、nposとの比較を行いました。
str1="Qiita";
str2="Qii";
str3="Qui";
if(str1.find(str2)!=std::string::npos){
cout<<"true"<<endl;
}
//true
//"Qii"が"Qiita"に入っていることの証明
if(str1.find(str3)!=std::string::npos){
cout<<"true"<<endl;
}
//false(表示されない)
//"Qui"は"Qiita"に入っていないことの証明
簡単に比較できていることがわかります。
ちなみにstd::string::nposを-1に変更しても動きます。
#まとめ
私自身、今までの文字列の比較は文字列Aに文字列Bの一文字目が含まれていたらそこからfor文で回し続けて判定して途切れたら文字列Bの次の文字に戻るという奇怪なコードを書いてましたが、これを使えば綺麗なコードを書くことができると思います。