您的位置:首页 > 其它

2016年 河南工业大学校赛 I 题.小天使改名

2017-11-22 22:57 197 查看

小天使改名

时间限制: 2 秒 内存限制: 128 MB | 提交: 496 解决: 136

题目描述

小天使的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

思路:两种情况 <1> 存在 相同字母交换位置 (字符串中必须存在两个和以上的相同字母), <2>两个不同字母交换位置


#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>

using namespace std ;
#define maxn 2000
char s1[maxn] , s2[maxn] ;
int pos1 , pos2 ;
int visit[26] ;

int main() {

int t ;
scanf("%d" , &t) ;
while(t--) {
scanf("%s %s" , s1 , s2 ) ;
memset(visit , 0 , sizeof(visit)) ;

int len  = strlen(s1) ;
int num= 0 ;
for(int i=0 ; i<len ; i++) {
visit[s1[i]-'a'] ++ ;

if(s1[i] != s2[i]) {
num ++ ;
if(num == 1 ){
pos1 = i ;
} else if(num == 2 ){
pos2 = i ;
} else if(num > 2) {
break ;
}
}
}
// 检查 一个 串中 是否可能出现相同字母 交换的情况
bool flag = false ;
for(int i=0 ; i<26 ; i++){
if(visit[i]>=2){
flag = true ;
}
}
//相同字母交换位置 和 不同字母交换位置两种情况
if((num == 0 && flag == true) ||(num == 2 && s1[pos1] == s2[pos2] && s1[pos2] == s2[pos1])){
printf("YES\n") ;
} else {
printf("NO\n") ;
}
}

return 0 ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: