首页 > 代码库 > hautoj 1268 小天使改名

hautoj 1268 小天使改名

1268: 小天使改名

时间限制: 2 秒  内存限制: 128 MB
提交: 437  解决: 123
提交 状态 

题目描述

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

说来惭愧,第一次组队参加线下比赛,卡在这题上,怎么都找不到错误,导致一个队伍三个人心态爆炸。

后来才发现一个坑,就是没有交换,没有相同字符的时候,前后相等的输出是no。
如样例:
输入:
ch
ch
输出:
NO

 1 #include<cstdio>
 2 #include<cstring>
 3 #define Max 1111
 4 char s1[Max],s2[Max];
 5 int main()
 6 {
 7    int t;
 8    scanf("%d",&t);
 9    while(t--)
10     {
11         int ascii[222]={0};
12         int flag=0,f=0;
13         int u,v;
14         scanf("%s %s",s1,s2);
15         int len=strlen(s1);
16         for(int i=0;i<len;i++)  //判断字符串内有没有相同的字符,如果有,则f++,否则 f=0 
17         {
18            int x=s1[i];
19            ascii[x]++;
20            if(ascii[x]>1)
21             {
22                f++;
23                break;
24             }
25         }
26         for(int i=0;i<len;i++)   //找出两个不同处 
27         {
28            if(flag==1&&s1[i]!=s2[i])
29             {
30                v=i;
31                break;
32             }
33            if(s1[i]!=s2[i])
34             {
35                u=i;
36                flag=1;
37             }
38         }
39         if(flag==1)   //如果存在两处不同,则将其位置置换。 
40         {
41            int temp=s1[v];
42            s1[v]=s1[u];
43            s1[u]=temp;
44         }
45         if(!strcmp(s1,s2))  
46         {
47            if(flag==0&&f==0)  //若两字符串相等且未置换且单个字符串内无重复字符,则不会是改后的名字 
48            printf("NO\n");
49            else
50            printf("YES\n");
51         }
52        else
53        printf("NO\n");   
54     }
55    return 0;
56 }

 


hautoj 1268 小天使改名