考えて競プロする

プログラミングコンテストの問題をどう考えて解いたかを記録していくブログです。使用言語はPython3

ABC018-B - 文字列の反転 を解く

ABC018-B - 文字列の反転

 

与えられた文字列について

指定された区間の部分文字列を反転させる操作を何度か行った結果を求める問題

 

文章の説明だけではわかりにくいので

実際にどのような操作を行うのかを例で確認してみる

 

文字列:abcdef

区間:3 5

 

区間:3 5 は文字列の左から3番目 - 5番目の区間、つまり "cde" を指している

これを反転させると "edc" であり、反転後の文字列は "abedcf" となる

 

さて、どのように解こうか?

S(1|S|100), N(1N100) という感じで、制約もゆるいので

言われた通りの操作をやるだけでよいと思われる

 

反転処理をPythonでどのように書くかが少し問題だ

文字列は、いったん list型 に変換することで reversed メソッドが使用できる

その後に join メソッドを使って文字列型に戻せばいい

 

文字列は、list() でラップすることで list型 に変換できる

>>> l=list('abcde')
>>> l
['a', 'b', 'c', 'd', 'e']
 

reversed メソッドは、リストを逆順に並び替えるメソッド

>>> l=['a','b','c','d','e']
>>> l=list(reversed(l))
>>> l
['e', 'd', 'c', 'b', 'a']

 

join メソッドを使用することで、リストをつなぎあわせて

文字列型に戻すことができる

>>> l
['e', 'd', 'c', 'b', 'a']
>>> l=''.join(l)
>>> l
'edcba'
 
しかし問題がもう一つ、区間文字列をどのようにして取るか?
これはリストのスライスを使用する
>>> l
['a', 'b', 'c', 'd', 'e']

>>> l[:2]
['a', 'b']

>>> l[2:]
['c', 'd', 'e']

>>> l[2:4]
['c', 'd']

>>> l[4:]
['e']
上記のように、区間を指定することでリストの一部を取り出すことができる
 
これらを使用して
 
① 指定された区間を取り出して
② list 型 に変換
③ reversed メソッド を使用して反転
④ join メソッド を使用して結合、文字列型に戻す
⑤ "+" 演算子を使用して取り出された文字列の残りと組み合わせる
 
という処理を書いてみる
 

提出したコード

# 入力
S=input()
N=int(input())

for i in range(N):
  l,r=map(int,input().split())
  S=S[:l-1]+''.join(list(reversed(S[l-1:r])))+S[r:]

# 出力
print(S)

 

上記の①〜⑥を一行で一気に書いたので読みにくいかも…

 

リストは 0-index であるので -1 を行っている箇所があるので注意

ややこしいので何度か実験しつつ実装を行った

 

提出結果はACでした