全探索しよう! こういう問題で、ただちに「全探索しよう」と思えるかどうかがすごく大事!
問題概要
長さの等しい文字列 が与えられる。 に対して、次の操作を高々 1 回実行することで、 に一致させられるかどうかを判定せよ。
(操作) の隣り合う文字を swap する
制約
考えたこと
全探索しよう! 具体的には、 に対して「隣り合う文字に操作する方法」は 通りある。つまり、 に対して、
「文字 と文字 を入れ替える」
というものである (0-indexed で表した)。
これらをすべて試して、 に一致するものがあるかどうかを調べればよい。
コード
#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; }