UVa1339_Ancient Cipher(古老的密码)
程序员文章站
2022-03-13 20:50:06
...
题目:
题目描述: 给定两个长度相同且不超过100的字符串,判断是否能把其中一个字符串的各个字母重排,然后对26个字母做一一映射,使得两个字符串相同。例如,JWPUDJSTVP重排后可以得到WJDUPSJPVT,之后把每个字母映射到它的前面一个字母,得到VICTORIOUS,输入两个字符串,输出YES或者NO。
分析:
因为字母可以重排,所以位置不重要,而字母出现的次数是重要的。这样先统计一下两个字符串中各个字母出现的次数,然后进行排序,只要两个数组排序后的结果相同,那么输入的两个串就可以通过重排和一一映射变得相同。
我的代码:
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <vector>
#include <string>
using namespace std;
typedef long long ll;
int x[110],y[110];
int main()
{
char a[110],b[110];
scanf("%s%s",a,b);
int n=strlen(a);
char ch;
char z[110];
for(int i=0;i<n;i++)
{
if(a[i]=='\0') continue;
ch=a[i];
z[i]=ch;
for(int j=i;j<n;j++)
{
if(ch==a[j]){
x[i]++;
a[j]='\0';
}
}
}
for(int i=0;i<n;i++)
{
if(b[i]=='\0') continue;
ch=b[i];
for(int j=i;j<n;j++)
{
if(ch==b[j]){
y[i]++;
b[j]='\0';
}
}
}
sort(x+0,x+n);
sort(y+0,y+n);
/* for(int i=0;i<n;i++)
{
printf("x%d=%d\n",i,x[i]);
printf("y%d=%d\n",i,y[i]);
}*/
for(int i=0;i<n;i++)
{
if(x[i]!=y[i]){
puts("NO");
return 0;
}
}
puts("YES");
}
代码简化:
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <vector>
#include <string>
using namespace std;
typedef long long ll;
int x[110],y[110];
int main()
{
char a[110],b[110];
scanf("%s%s",a,b);
int n=strlen(a);
for(int i=0;i<n;i++){
x[a[i]-'A']++;
y[b[i]-'A']++;
}
sort(x+0,x+26);
sort(y+0,y+26);
/* for(int i=0;i<26;i++)
{
printf("x%d=%d\n",i,x[i]);
printf("y%d=%d\n",i,y[i]);
}*/
for(int i=0;i<26;i++)
{
if(x[i]!=y[i]){
puts("NO");
return 0;
}
}
puts("YES");
}