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
") ; 
        } else {
            printf("NO
") ; 
        }
    }

    return 0 ;
}
原文地址:https://www.cnblogs.com/yi-ye-zhi-qiu/p/7881792.html