牛客练习赛111 B一次交换

题目链接
在这里插入图片描述
示例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();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值