欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

UVa1339_Ancient Cipher(古老的密码)

程序员文章站 2022-03-13 20:50:06
...

题目:

UVa1339_Ancient Cipher(古老的密码) 
UVa1339_Ancient Cipher(古老的密码)

题目描述: 给定两个长度相同且不超过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");
} 

 

相关标签: UVA