Santa Claus and Keyboard Check
题面:


题目描述
给你两个长度相同但不为0的字符串a与b(字符串里面只包括26个小写字母,不考虑’\0’),然后从左向右对应扫描a,b中的每一个字符,也就是说先比较a和b的第一个字符然后比较a和b的第二个字符,从而以此类推。如果出现一个字母对应不止1个字母的情况就输出-1并结束程序(解释:见上图第三个样例,第一个字符串的第三个字符’r’对应第二个字符串的第三个字符’r’但是第一个字符串的第四个字符’r’对应第二个字符串的第四个字符’i’。因此r既对应了r也对应了i),否则找到两个字符串对应关系中出现易位的个数并输出个数与易位情况,对于每种易位情况最多输出1次。(解释:1)字符a对应字符a不是易位 2)字符a与字符b是易位 3)字符b与字符a是易位 但是2) 3)这两种情况的对应关系都是a与b所以只能输出一次)
题目分析
这个解答过程中要关注几个方面
(1)如何扫描字符串a与字符串b的每一个字符 -----循环(for(i=0;i<strlen(a));i++)
(2)如何检查一个字母可能对应不止一个字母
pair<char,char>数组+c[100]数组
pair<char,char>数组存储的是扫描过程中出现易位的每一对
c[100]数组储存的是扫描过程中出现非易位的每一对
输出-1并结束程序的字符串只符合两个特征
a)az zz
zz za
b)az ab
zb zz
情况a第二种情况可以用
if(c[a[i]-97]) {if(b[i]!=a[i]) break;}
if(c[b[i]-97]) {if(b[i]!=a[i]) break;}
if(a[i]==b[i]) {c[a[i]-97]=1;continue;}
情况a第一种情况可以用
for(i=1;i<=cnt;i++)
if(c[p[i].first-97]||c[p[i].second-97]) ag=1;
if(ag) {printf("-1\n");}
检查最后pair里面是否有这种-1的情况
情况b的两种情况
if(a[i]==p[j].first) {if(b[i]!=p[j].second) break;}
if(a[i]==p[j].second) {if(b[i]!=p[j].first) break;}
if(b[i]==p[j].first) {if(a[i]!=p[j].second) break;}
if(b[i]==p[j].second) {if(a[i]!=p[j].first) break;}
(3)如何使得每组对应只能出现1次
if(a[i]==p[j].second&&b[i]==p[j].first) ag=1;
if(a[i]==p[j].first&&b[i]==p[j].second) ag=1;
把pair里面的元素与出现易位的比较,如果ag>0就直接continue,不入pair

AC代码

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef pair<char,char> P;
char a[1002],b[1002];
int c[100];
P p[1002];
int main(){
int cnt=0,i,j,ag;
scanf("%s%s",a,b);
for(i=0;i<strlen(a);i++){
if(c[a[i]-97]) {if(b[i]!=a[i]) break;}
if(c[b[i]-97]) {if(b[i]!=a[i]) break;}
if(a[i]==b[i]) {c[a[i]-97]=1;continue;}
else{
ag=0;
for(j=1;j<=cnt;j++){
if(a[i]==p[j].first) {if(b[i]!=p[j].second) break;}
if(a[i]==p[j].second) {if(b[i]!=p[j].first) break;}
if(b[i]==p[j].first) {if(a[i]!=p[j].second) break;}
if(b[i]==p[j].second) {if(a[i]!=p[j].first) break;}
if(a[i]==p[j].second&&b[i]==p[j].first) ag=1;
if(a[i]==p[j].first&&b[i]==p[j].second) ag=1;
}
}
if(j!=cnt+1) break;
if(ag>0) continue;
p[++cnt].first=a[i];p[cnt].second=b[i];
}
ag=0;
if(i!=strlen(a)) printf("-1\n");
else{
		for(i=1;i<=cnt;i++)
		if(c[p[i].first-97]||c[p[i].second-97]) ag=1;
		if(ag)  {printf("-1\n");}
else{
printf("%d\n",cnt);
for(i=1;i<=cnt;i++)
cout<<p[i].first<<' '<<p[i].second<<endl;
}
}
return 0;
}