AtCoder Beginner Contest 167 A問題「Registration」の解説を行います。
問題概要
文字列$S$,$T$が与えられる。
$T$が$S$の末尾に1文字追加した文字列であるか判定せよ。
$T$が条件を満たすならばYes
条件を満たさなければNo
と出力せよ。
制約
・$S,T$は英小文字列
・$1 \leq |S| \leq 10$
・$|T| = |S| + 1$
解説
文字列$T$について、$|S|$文字目までのスライスを取得し、それが$S$と等しいかどうかを判定すればよいです。
ここで、スライスとは、文字列の一部のことを指します。
スライスの取得方法
Python3では T[i:j+1]
で$T$の$i$文字目から$j$文字目までのスライスを取得することができます。
(ここで、0-indexであることに注意して下さい)
[コラム]0-index,1-indexとは?
コンピューター上では、数字のカウンタは1ではなく0から始めます。ですので、私たちが処理する文字列は、私たちにとっては1文字目から数えますが、コンピューターにとっては0文字目なのです。
コンピューター的な配列(文字列含む)の数え方を0-indexといいます。
それに対して、私たちが普段している配列の数え方を1-indexといいます。
今後も解説でよく使用する言葉ですので覚えておきましょう。
本題に戻ります。
C++では、T.substr(i,j)
で$T$の$i$番目から$j$文字分のスライスを取得することが出来ます。(iは0-indexです)
Javaでは、T.substring(i,j+1)
で$T$の$i$番目から$j$番目までのスライスを取得することができます。(i,jは0-indexです)
これらの関数を用いて$T$のスライスを取得し、$S$と同じかどうか判定すれば良いでしょう。
以下、Python3,C++,Javaでの解答例を示します。
各言語解答例
Python3での解答例
S = input()
T = input()
if T[0:len(S)] == S:
print("Yes")
else:
print("No")
C++での解答例
#include<bits/stdc++.h>
using namespace std;
int main(){
string S,T;
cin >> S >> T;
string Judge = T.substr(0,S.size());
if (Judge == S){
cout << "Yes" << endl;
}else{
cout << "No" << endl;
}
}
実は、このコードを実行すると、WAになります。(分かる方は)理由は分かりますか? 理由を知りたい方は調べてみて下さい。 正解コードは以下の通りです。Javaでの解答例
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
String S = scan.nextLine();
String T = scan.nextLine();
String judge = T.substring(0,S.length());
if (judge == S){
System.out.println("Yes");
}else{
System.out.println("No");
}
}
}
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
String S = scan.next();
String T = scan.next();
String judge = T.substring(0,S.length());
if (S.equals(judge)){
System.out.println("Yes");
}else{
System.out.println("No");
}
}
}