AtCoder

ABC374 B問題(Unvarnished Report)を解く

AtCoder_ABC374_B

AtCoder が提供しているABC(AtCoder Beginner Contest)374 B問題をC++とPythonで解いてみました。ABC374は、2024年10月5日21:00に実施されました。

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

B問題 Unvarnished Report(Difficulty : 28)

問題の詳細は、リンク先をご覧ください。

ABC374 B問題 Unvarnished Report

2つの文字列の異なっている場所を出力します。AtCoder Problems による Difficulty は 28 でした。

解答案

C++ プログラム例(ABC374B)

次の手順で判定を行います。インデックスは0から始まります。

  • 文字列 $S$ と $T$ の短い文字列の長さを変数 len に格納する。
  • [0, len) で文字列の差があれば、その位置を出力する。
  • [0, len) で文字列の差が無ければ、
    • 文字列 $S$ と $T$ の長さが異なれば len + 1 を出力する。
    • 文字列 $S$ と $T$ の長さが等しければ、完全に一致しているため 0 を出力する。

以下が、C++プログラムです。

#include <bits/stdc++.h>
using namespace std;

int main()
{
	string s, t;
	cin >> s >> t;

	int result = 0;
	int len = min(s.length(), t.length());
	for (int i = 0; i < len; ++i) {
		if (s[i] != t[i]) {
			result = i + 1;
			break;
		}
	}
	if ((result == 0) && (s.length() != t.length())) {
		result = len + 1;
	}

	cout << result << endl;

	return 0;
}

C/C++ の文字列は、末尾に値としての0の文字(’\0’)を配置しています。’\0′ は他の文字と一致しないため、長さが異なる場合でも気にしないで比較できます。前のプログラムと比較するとすっきりと書けています。

#include <bits/stdc++.h>
using namespace std;

int main()
{
	string s, t;
	cin >> s >> t;

	int result = 0;
	int len = max(s.length(), t.length());
	for (int i = 0; i < len; ++i) {
		if (s[i] != t[i]) {
			result = i + 1;
			break;
		}
	}

	cout << result << endl;

	return 0;
}

どちらも AC(Accepted=正しいプログラム)と判定されました。

Python プログラム例(ABC374B)

Python版も基本的な考え方は同じです。最初に紹介した C++ プログラムを移植しました。

"""AtCoder Beginner Contest 374 B"""
s = input()
t = input()

result = 0
length = min(len(s), len(t))
for i in range(length):
    if s[i] != t[i]:
        result = i + 1
        break
if result == 0 and len(s) != len(t):
    result = length + 1

print(result)

こちらも「AC」と判定されました。

最後に

文字列について学ぶ良い練習問題でした。

引き続き ABC の問題を紹介していきます。

COMMENT

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

CAPTCHA