题目地址: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
****************************************************************/