AtCoder が提供しているABC(AtCoder Beginner Contest)374 B問題をC++とPythonで解いてみました。ABC374は、2024年10月5日21:00に実施されました。
AtCoder の紹介はこちらに、プログラミングの方針はこちらに記事があります。
B問題 Unvarnished Report(Difficulty : 28)
問題の詳細は、リンク先をご覧ください。
2つの文字列の異なっている場所を出力します。AtCoder Problems による Difficulty は 28 でした。
解答案
C++ プログラム例(ABC374B)
次の手順で判定を行います。インデックスは0から始まります。
- 文字列 $S$ と $T$ の短い文字列の長さを変数
len
に格納する。 - [0, len) で文字列の差があれば、その位置を出力する。
- [0, len) で文字列の差が無ければ、
- 文字列 $S$ と $T$ の長さが異なれば
len + 1
を出力する。 - 文字列 $S$ と $T$ の長さが等しければ、完全に一致しているため 0 を出力する。
- 文字列 $S$ と $T$ の長さが異なれば
以下が、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 の問題を紹介していきます。