Official

B - typo Editorial by penguinman


\(S\)\(T\) が一度も操作を行わない状態で一致しているか、および \(i=1,2,\ldots,(S\) の長さ\()-1\) について \(S\)\(i\) 文字目と \(i+1\) 文字目を入れ替えた場合に \(S\)\(T\) が一致するかをそれぞれ判定すればよいです。

計算量は \(N=(S\) の長さ\()\) として \(O(N^2)\) となります。

実装例 (Python)

S = list(input())
T = list(input())
ans = "No"
if S == T:
    ans = "Yes"
for i in range(len(S)-1):
    S[i],S[i+1] = S[i+1],S[i]
    if S == T:
        ans = "Yes"
    S[i],S[i+1] = S[i+1],S[i]
print(ans)

また、工夫をすると計算量を \(O(N)\) まで落とすことも可能です。

実装例 (C++)

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

int main(){
    string S,T; cin >> S >> T;
    string ans = "No";
    if(S == T) ans = "Yes";
    for(int i=0; i<S.size(); i++){
        if(S[i] != T[i]){
            if(0 < i){
                swap(S[i-1],S[i]);
                if(S == T) ans = "Yes";
                swap(S[i-1],S[i]);
            }
            if(i+1 < S.size()){
                swap(S[i],S[i+1]);
                if(S == T) ans = "Yes";
                swap(S[i],S[i+1]);
            }
            break;
        }
    }
    cout << ans << endl;
}

posted:
last update: