フラグの考え方で解くのが一番分かりやすいと思った
問題概要
英小文字と、文字 ,
と "
からなる長さ の文字列 が与えられます。
に含まれる文字 "
の個数は偶数であることが保証されています。
に含まれる "
の個数を 個とすると、各 について 番目の "
から 番目の "
までの文字のことを「括られた文字」と呼びます。
あなたの仕事は、文字列 に含まれる ,
のうち、括られた文字でないもの を .
で置き換えて得られる文字列を答えることです。
制約
考えたこと
色んな考え方がありそう。ここでは、for
文を用いて処理していく方法を考える。
for
文中の各文字に対して「今括られているのかどうか」を表すフラグ変数を用意する
is_inclusion
← 今括られているかどうかを表す値 (括られている:1、括られていない:0)
そして、次のような for
文で処理していけばよい。
int is_inclusion = 0; for (int i = 0; i < N; ++i) { if (S[i] == '"') { // 括られているかどうかが変化する is_inclusion = 1 - is_inclusion } else if (S[i] == ',' && !is_inclusion) { S[i] = '.'; } }
計算量は となる。
コード
#include <bits/stdc++.h> using namespace std; int main() { int N; string S; cin >> N >> S; int is_inclusion = 0; for (int i = 0; i < N; ++i) { if (S[i] == '"') { // 括られているかどうかが変化する is_inclusion = 1 - is_inclusion; } else if (S[i] == ',' && !is_inclusion) { S[i] = '.'; } } cout << S << endl; }