多重 for 文の全探索に慣れよう!
問題概要
長さ の文字列
が与えられる。次の条件を満たす 3 つ組の整数
が存在するかどうかを判定せよ。
の
文字目は 'I' である
の
文字目は 'O' である
の
文字目は 'I' である
制約
解法
を満たすような
は次のような 3 重の
for 文で走査できます。
for (int i = 1; i <= N; ++i) { for (int j = i + 1; j <= N; ++j) { for (int k = j + 1; k <= N; ++k) { } } }
ここで、変数 j の初期値を 1 ではなく i + 1 にしていることに注意しましょう。同様に、変数 k の初期値も 1 ではなく j + 1 にしています。これによって、
という関係性が表現できます。
あとは、 の
文字目がそれぞれ I, O, I であることを判定しましょう。
コード
ここでは、0-indexed で実装しました。つまり、 を 0 以上
未満の範囲で探索することとしました。
#include <bits/stdc++.h> using namespace std; int main() { int N; string S; cin >> N >> S; bool res = false; for (int i = 0; i < N; ++i) { for (int j = i + 1; j < N; ++j) { for (int k = j + 1; k < N; ++k) { if (S[i] == 'I' && S[j] == 'O' && S[k] == 'I') { res = true; } } } } if (res) cout << "Yes" << endl; else cout << "No" << endl; }