for
文のいい練習問題!
問題概要
英小文字と文字 .
のみからなる文字列 が与えられる。
を文字 .
で分割したときの末尾の文字列を出力してください。
制約
- には文字
.
が 1 つ以上含まれる
考えたこと
まずは、 に含まれる文字 .
のうち、最も右側にあるものがどこにあるのか(それを表す の添字を last
とする)を求めることにしよう。これは 2 種類の方針が考えられる。
- 1:文字列 を左側から見ていく。つまり、 の順に
for
文を回して、S[i] == '.'
となるたびにlast
を更新する - 2:文字列 を右側から見ていく。つまり、 の順に
for
文を回して、最初にS[i] == '.'
となったときにlast
を更新の上、break
する
ここでは、オーソドックスな方針 1 で実装しよう。次のように実装できる。
int last; for (int i = 0; i < S.size(); ++i) { if (S[i] == '.') last = i; }
文字列 中の最後の文字 '.' の添字 last
が求められたならば、 の last + 1
文字目以降を答えればよい。
コード
#include <bits/stdc++.h> using namespace std; int main() { string S; cin >> S; int last; for (int i = 0; i < S.size(); i++) { if (S[i] == '.') last = i; } cout << S.substr(last + 1) << endl; }