けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

AtCoder ABC 221 B - typo (6Q, 灰色, 200 点)

全探索しよう! こういう問題で、ただちに「全探索しよう」と思えるかどうかがすごく大事!

問題概要

長さの等しい文字列  S, T が与えられる。 S に対して、次の操作を高々 1 回実行することで、 T に一致させられるかどうかを判定せよ。

(操作)  S の隣り合う文字を swap する

制約

  •  1 \le |S| = |T| \le 100

考えたこと

全探索しよう! 具体的には、 S に対して「隣り合う文字に操作する方法」は  N-1 通りある。つまり、 i = 0, 1, \dots, N-2 に対して、

「文字  S_{i} と文字  S_{i+1} を入れ替える」

というものである (0-indexed で表した)。

これらをすべて試して、 T に一致するものがあるかどうかを調べればよい。

コード

#include <bits/stdc++.h>
using namespace std;

int main() {
    string S, T;
    cin >> S >> T;

    bool res = false;
    if (S == T) res = true;  // 1 回も行わない場合

    for (int i = 0; i+1 < S.size(); i++) {
        // S[i] と S[i+1] を swap して一致するかを試す
        string S2 = S;
        swap(S2[i], S2[i+1]);
        if (S2 == T) res = true;
    }
    if (res) cout << "Yes" << endl;
    else cout << "No" << endl;
}