2016年 河南工业大学校赛 I 题.小天使改名
小天使改名
时间限制: 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 ; }