题解 | #一次交换#
一次交换
https://ac.nowcoder.com/acm/problem/251441
题目要求必须且只能交换一次(很多人没拿满多半是这里出错),哪怕一开始两字符串相等,交换后可能就不等了。 思路:(有两种情况)
1.两字符串有且只有两个地方不等,且A串第一个字符==B串第二个字符,A串第二个字符==B串第一个字符
2.两字符串相等,且字符串中至少有一个字符出现次数大于1,这样交换后才会相等
#include<bits/stdc++.h>
using namespace std;
vector<pair<char,char>> a;
int cnt[26];
int main()
{
int n; cin>>n;
string s1,s2; cin>>s1>>s2;
// if(s1.size()!=s2.size()){//防止两字符串不等长,但对这道题是多余的
// cout<<"NO";
// return 0;
// }
for(int i=0; i<s1.size(); i++){
if(s1[i]!=s2[i]){
a.push_back(make_pair(s1[i],s2[i]));
}
cnt[s1[i]-'a']++;
}
bool flag = false;
for(int i=0; i<26; i++)
if(cnt[i]>1){
flag = true;
break;
}
// if(a.size()!=2) cout<<"NO";
// else if(a[0].first!=a[1].second||a[1].first!=a[0].second)
// cout<<"NO";
// else cout<<"YES";
if((a.size()==2&&a[0].first==a[1].second&&
a[1].first==a[0].second)||(a.empty()&&flag))
cout<<"YES";
else cout<<"NO";
return 0;
}