本サイトAIZU ONLINE JUDGE ITP1_8_D へはこちらから
問題:リング
図のようなリング状の文字列 s の任意の位置から、時計回りに連続した文字をいくつか選んで、文字列 p が作れるかを判定するプログラムを作成してください。
Input
1行目に文字列 s が与えられます。
2行目に文字列 p が与えられます。
Output
p が作れる場合は Yes と、作れない場合は No と1行に出力してください。
Sample Input 1
vanceknowledgetoad
advance
Sample Output 1
Yes
Sample Input 2
vanceknowledgetoad
advanced
Sample Output 2
No
解答例
s = input()
p = input()
s = s * 2
if s.find(p) != -1:
print('Yes')
else:
print('No')
解説
以下のように解いていきます。
文字列 s 、pの読み込み
文字列s、文字列pを別々に読み込みます。ここでは、input関数を使用し、それぞれ任意の文字列を取得します。
# キーボードからの入力を文字列として受け取る
s = input()
p = input()
※サイト内「AIZU ONLINE JUDGE ITP1_1_Bをpythonで解いてみた」の、input関数とはに使用方法が書かれておりますのでぜひご覧ください。
sがpの中にあるか判定
まずは、sを2倍し、sの初めと最後の文字をつなぎます。そしてfindメソッドを用いて、文字列pが存在するか確認します。
ここで使用するfindメソッドについて説明します。
findメソッドとは
findメソッドは文字列型のメソッドで、基本的な文字列の検索方法になります。findメソッドはこのように使います。
str.find(sub[, start[, end]])
引数に指定した文字列( sub )が文字列 str の中で最初に現れる位置をインデックスで返します。範囲を指定する start と end は省略可能です。
実際の使い方は次の通りです。
st_found = "Hello, Python and Perl and Ruby and more."
fd = st.find('Python')
print(fd)
# 出力
7
st_not_fount = "Hello, Python and Perl and Ruby and more."
fd = st.find('Haskell')
print(fd)
# 出力
-1
出力結果は、findメソッドの引数に渡した文字列が、検索対象の文字列の中にある場合のインデックスを表しています。st_foundの文字列にfindメソッドを使用した際に「7」という数字が返されたので、検索対象の変数st_foundの、インデックスで7番目に「Python」という文字が見つかったことが分かります。これがPythonの基本的な文字列の検索方法になります。
また、st_not_fountにfindメソッドを使用した際は、検索した文字列’Haskell’が検索対象の文字列にないので、「-1」を返します。このように指定した文字列が見つからなかった場合には -1 が返されます。
今回は、sの中にpが存在する場合、つまり、findメソッドの検索結果である戻り値が-1でない場合’Yes’を表示します。存在しない場合’No’を表示します。
# s を2倍しsの文字列の最初と最後をつなぐ
s = s * 2
# sの中にpがあるか判定する。
if s.find(p) != -1:
print('Yes')
else:
print('No')
最後に、もう一度プログラムを確認してみましょう。
# キーボードからの入力を文字列として受け取る
s = input()
p = input()
# s を2倍しsの文字列の最初と最後をつなぐ
s = s * 2
# sの中にpがあるか判定する。
if s.find(p) != -1:
print('Yes')
else:
print('No')
コメント