「連続文字列」を処理する典型問題。
問題概要
文字 A, B, C のみからなる長さ の文字列 が与えられる。
文字列 に含まれる連続部分文字列 "ABC" のうち、それが始まる最小の添字を答えよ。"ABC" を含まない場合は -1 を出力せよ。
解法 (1):関数 substr()
の活用
C++ では、S.substr(i, 3)
によって、文字列 の 文字目 から 3 文字分 (つまり、) を取り出せる。
よって、for
文を用いて を見ていって、初めてS.substr(i, 3)
が "ABC" となる箇所を求めればよい。
コード
#include <bits/stdc++.h> using namespace std; int main() { int N; string S; cin >> N >> S; int res = -1; for (int i = 0; i+2 < N; ++i) { if (S.substr(i, 3) == "ABC") { res = i+1; // 1-indexed にする break; } } cout << res << endl; }
解法 (2)
仮に関数 substr()
を知らなくても、S[i]
と S[i+1]
と S[i+2]
をすべて見ることでも解ける。
コード
#include <bits/stdc++.h> using namespace std; int main() { int N; string S; cin >> N >> S; int res = -1; for (int i = 0; i+2 < N; ++i) { if (S[i] == 'A' && S[i+1] == 'B' && S[i+2] == 'C') { res = i+1; // 1-indexed にする break; } } cout << res << endl; }