题目链接
示例1
输入
5
abcda
bacda
输出
YES
示例2
输入
3
abc
abc
输出
NO
解题思路:
字符串a要交换一次,然后和b比较能不能相等
第一个情况就是恰好有两个不相等,那么交换一下再判断即可
注:不能直接判交换后是对的,如果交换后还不对呢?
第二种情况就是字符串a和b本来就相等,字符串a要交换一次,要保证不变一定要符合其中两个字符相等即可
既然要交换,我们可以用数组来存下标,记录要交换的下标(不相等的下标),当不相等的超过2个直接判NO,如果是两个交换后再判断即可
当时代码
#include <bits/stdc++.h>
using namespace std;
#define x first
#define y second
#define lowbit(x) ((x)&(-(x)))
#define int long long
#define rep(i,a,b) for(int i=(int)a,i##i=(int)b;i<=i##i;i++)
#define per(i,a,b) for(int i=(int)a,i##i=(int)b;i>=i##i;i--)
typedef long long ll;
typedef pair<int,int> PII;
typedef unsigned long long ULL;
const int N = 1000005;
const double PI = acos(-1);
map<char,int>ma;
void solve()
{
int n;cin>>n;
string a,b;
cin>>a>>b;
if(a==b){//相等的情况(情况二)
for(int i=0;i<a.size();i++){
if(i+1<a.size()&&a[i]==a[i+1]){
cout<<"YES";
return ;
}
}
cout<<"NO";
}
//下面为情况一
vector<int>v;
int flag=0;int flag2=0;
for(int i=0;i<a.size();i++){
if(a[i]!=b[i]){
v.push_back(i);
}
}
if(v.size()>2){//如果有超过两个不相等就直接NO
cout<<"NO";
return ;
}
if(v.size()==2){//测试交换后能不能相等
char ch=a[v[0]];
a[v[0]]=a[v[1]];
a[v[1]]=ch;
if(a==b)cout<<"YES";
else cout<<"NO";
}
}
signed main()
{
std::ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int _ = 1;
//cin>>_;
while(_--)
solve();
}
其实第二种情况是没有完全符合的因为只判断了相邻情况。下面给出可以通过加强数据的代码
#include <bits/stdc++.h>
using namespace std;
#define x first
#define y second
#define lowbit(x) ((x)&(-(x)))
#define int long long
#define rep(i,a,b) for(int i=(int)a,i##i=(int)b;i<=i##i;i++)
#define per(i,a,b) for(int i=(int)a,i##i=(int)b;i>=i##i;i--)
typedef long long ll;
typedef pair<int,int> PII;
typedef unsigned long long ULL;
const int N = 1000005;
const double PI = acos(-1);
map<char,int>ma;
void solve()
{
int n;cin>>n;
string a,b;
cin>>a>>b;
if(a==b){
for(int i=0;i<a.size();i++){
ma[a[i]]++;
if(ma[a[i]]>=2){//相同的字符有两个以上就可以直接判
cout<<"YES";
return ;
}
}
cout<<"NO";
}
vector<int>v;
int flag=0;int flag2=0;
for(int i=0;i<a.size();i++){
if(a[i]!=b[i]){
v.push_back(i);
}
}
if(v.size()>2){
cout<<"NO";
return ;
}
if(v.size()==2){
char ch=a[v[0]];
a[v[0]]=a[v[1]];
a[v[1]]=ch;
if(a==b)cout<<"YES";
else cout<<"NO";
}
}
signed main()
{
std::ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int _ = 1;
//cin>>_;
while(_--)
solve();
}