
关键在于判断是否能够得到解决办法,我的思路就是用一个数组来记录每个小写字母对应的按键,如果它出现对应两个级以上不同的按键那么就说明不能得出解决办法,直接打印‘-1’.如果能够得出解决办法,就扫描一下数组统计需要交换的次数,再打印解决方案就OK
AC代码:
#include<cstdio> #include<cstring> const int maxn=1000+5; char a[maxn],b[maxn]; int f[26]; char s[26]; struct node{ int x,y; }; int main(){ while(scanf("%s%s",a,b)!=EOF){ memset(f,0,sizeof(f)); int n=strlen(a); int flag=1; for(int i=0;i<n;++i){ if(f[a[i]-'a']==0) { s[a[i]-'a']=b[i]; f[a[i]-'a']++; } else if(f[a[i]-'a']==1){ if(s[a[i]-'a']!=b[i]) { flag=0; break; } } if(f[b[i]-'a']==0) { s[b[i]-'a']=a[i]; f[b[i]-'a']++; } else if(f[b[i]-'a']==1){ if(s[b[i]-'a']!=a[i]) { flag=0; break; } } } if(!flag) printf("-1\n"); else { int k=0; node ans[26]; int vis[26]; memset(vis,0,sizeof(vis)); for(int i=0;i<26;++i){ if(vis[i]) continue; if(f[i]==1&&s[i]-'a'!=i) { ans[k].x=i; ans[k++].y=s[i]-'a'; vis[i]=vis[s[i]-'a']=1; } } printf("%d\n",k); for(int i=0;i<k;++i) printf("%c %c\n",ans[i].x+'a',ans[i].y+'a'); } } return 0; }
如有不当之处欢迎指出!