AtCoder が提供しているABC(AtCoder Beginner Contest)279 のB問題をC++とPythonで解いてみました。ABC279は、2022年11月26日21:00に実施されました。
AtCoder の紹介はこちらに、プログラミングの方針はこちらに記事があります。
B問題 LOOKUP(Difficulty : 39)
問題はリンク先をご覧ください。
文字列を操作する問題です。AtCoder Problems による Difficulty は、39 でした。
解答案
問題を解く方針を書きだします。
- 文字列SとTを読み込む。
- 文字列Sを先頭から末尾の場所まで以下を行う。
- 文字列のSのその場所から開始して文字列Tと一致しているか確認する。
- 結果を出力する。
C++ プログラム例(ABC279B)
String 文字列として、S と T を読みます。S から substr で文字列を切り出し、T と一致しているか確認します。substr は、第2引数(文字列の長さ)が大きくても範囲外はアクセスしない仕様になっています。ただし、第1引数(文字列の開始場所)が文字列の範囲外にある場合は、例外となります。
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s, t;
cin >> s >> t;
bool result = false;
for (int i = 0; i < s.length(); ++i) {
if (s.substr(i, t.length()) == t) {
result = true;
}
}
if (result) {
cout << "Yes" << endl;
} else {
cout << "No" << endl;
}
return 0;
}
string が用意しているメソッドを使っているため、すっきりと書けています。配列として、1文字毎に確認することもできます。ただし、その場合は文字列の範囲外のアクセスを避けるためのコードが煩雑になります。
上記は、AC(Accepted=正しいプログラム)と判定されました。
Python プログラム例(ABC279B)
Python は、部分文字列の判定が簡単に書けます。以下となります。
"""AtCoder Beginner Contest 279 B"""
s = input()
t = input()
print("Yes" if t in s else "No")
こちらも「AC」と判定されました。
最後に
C++ でも Python でも、文字列について、多くのライブラリ(メソッド)を用意しています。文字列の場合、配列(リスト)と考えてプログラムを書くことはできますが、多くの場合、用意されているメソッドを使う方がすっきりと書けると思います。
引き続き ABC の問題を紹介していきます。