思路:之前经过一次次的完善到了%80不理解哪里出错了,后来看了别人的题解发现有一块没有判断,那就是当两个字符串相等时,如果一个字符串其中的有个字母出现两次以上那么也可以交换一次输出YES,所以继续完善AC了这道题。首先输入两个字符串然后在用两个额外的字符串等于输入的字符串,对这两个字符串进行排序,如果排序之后仍不相等,可以直接与之前刚开始输入两个相同的字符串相等放在一起进行判断,再单独对刚开始相等的字符串进行check检查是否有一个字母至少出现两次,之后就可以循环判断两个字符串有几个字母不相等,只有有两个字母不相等才是YES其余都为NO,具体丑陋的代码如下:
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
string s1,s2;
string s3,s4;
int cnt[30];
bool check()
{
for(int i=0;i<s1.size();i++)
{
cnt[s1[i]-'a']++;
if(cnt[s1[i]-'a']>=2)
return true;
}
return false;
}
int main()
{
int n;
cin>>n;
cin>>s1>>s2;
s3=s1;
s4=s2;
sort(s3.begin(),s3.end());
sort(s4.begin(),s4.end());
if(s1==s2||s3!=s4)
{
if(s1==s2&&check())
{
cout<<"YES";
}
else
{
cout<<"NO";
}
return 0;
}
int ans=0;
for(int i=0;i<n;i++)
{
if(s1[i]!=s2[i])
ans++;
}
if(ans!=2)
{
cout<<"NO";
return 0;
}
else
{
cout<<"YES";
return 0;
}
}