河南工业“玲珑杯”小天使改名

本文介绍了如何通过编程解决小天使ID变换问题,探讨了两种解法:暴力解法和常规解法,并提供了完整的C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目地址:http://218.28.220.249:50015/JudgeOnline/problem.php?id=1268

题目描述

小天使的b站帐号被大家发现啦。于是小天使决定改名,将他原有ID中的两个不同位置的字母进行交换。(小天使有可能将两个不同位置的相同字母进行交换,虽然这样做他的ID并没有发生变化)
Lsf知道小天使原来的ID,他想知道某个ID是否可能是小天使的新ID。

输入

第一行为数据组数T(T≤100)。
每组数据的第一行是字符串s1,(2≤length(s1)≤1000),为小天使的原始ID。
第二行是字符串s2,(length(s2)=length(s1)),为Lsf猜测的ID。
s1,s2均只含小写字母。

输出

对每组数据输出一行,如果这个ID可能是小天使的新ID,输出YES,否则输出NO。

样例输入

3
ch
hc
aa
aa
abc
abb
样例输出

YES
YES
NO

题意很简单,但注意小天使必须要交换一次,即如果第一行是ab,第二行也是ab时这就是不符合的,比赛时因为这点,整个比赛都打崩了,当然还是我太弱。。。现在感觉都快不想搞了,。。。

第一种完全暴力解法,把所有交换方式都试出来,两个for循环搞定,不过用string时会超时,不过我第一次就没超时啊。。。代码如下:

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
char s1[1010],s2[1010];
int solve(){
    int len = strlen(s1);
    for(int i=0;i<len;i++){
        for(int j=0;j<len;j++){
            if(i == j)  continue;
            swap(s2[i],s2[j]);
            if(strcmp(s1,s2) == 0)
                return 1;
            swap(s2[i],s2[j]);
        }
    }
    return 0;
}
int main(void){
    int t;
    scanf("%d",&t);
    while(t--){
        scanf("%s %s",s1,s2);
        if(solve()) printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}

第二种常规解法,判断字母中是否有重复,如果有重复,那么两个字符串相同也符合,如果没有重复就不能判断相等。然后再找出两个位置不同的字符,交换他们,然后再判断是否相同,代码如下:

#include<iostream>
#include<cstring>
#include<cmath>
#include<string>
#include<algorithm>
using namespace std;
string s1,s2,s3,s4;
string yes = "YES\n",no = "NO\n";
void solve(){
    s3 = s1,s4 = s2;
    sort(s3.begin(),s3.end());
    sort(s4.begin(),s4.end());
    int i,j,isrep = false;
    for(i=1;i<s3.size();i++){
        if(s3[i] == s3[i-1]){
            isrep = true;
            break;
        }
    }
    if(!isrep){
        if(s1 == s2){
            cout << no;
            return;
        }
    }
    int flag = 0,u = -1,v = -1;
    for(int i=0;i<s1.size();i++){
        if(flag == 1 && s1[i] != s2[i]){
            v = i;
            break;
        }
        if(flag == 0 && s1[i] != s2[i]){
            u = i;
            flag = 1;
        }
    }
    if(u != -1 && v != -1)
        swap(s2[u],s2[v]);
    if(s1 == s2)
        cout << yes;
    else
        cout << no;
    return;
}
int main(void){
    int t;
    cin >> t;
    while(t--){
        cin >> s1 >> s2;
        solve();
    }
    return 0;
}
/**************************************************************
    Problem: 1268
    User: henu5502169
    Language: C++
    Result: 正确
    Time:68 ms
    Memory:1704 kb
****************************************************************/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值