AtCoder

ABC279 B問題(LOOKUP)を解く

AtCoder_ABC279_B

AtCoder が提供しているABC(AtCoder Beginner Contest)279 のB問題をC++とPythonで解いてみました。ABC279は、2022年11月26日21:00に実施されました。

AtCoder の紹介はこちらに、プログラミングの方針はこちらに記事があります。

B問題 LOOKUP(Difficulty : 39)

問題はリンク先をご覧ください。

ABC279 B問題 LOOKUP

文字列を操作する問題です。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 の問題を紹介していきます。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA