1. 程式人生 > >古老的密碼

古老的密碼

題目:

給定兩個長度相同且不超過100的字串,判斷是否能把其中一個字串的各個字母重排,然後對26個字母做一個一一對映,使得兩個字串相同。例如,JWPUDJSTVP後可以得到WJDUPSJPVT,然後把每個字母對映到它前一個字母(B->A,C->B,...,A->Z),得到VICTORIOUS。輸入兩個字串,輸入YES或者NO。

分析:

 既然字母可以重排,則每個字母的位置並不重要,重要的是每個字母出現的次數。這樣可以先統計出兩個字串中各個字母出現的次數,得到兩個陣列cnt1[26]和cnt2[26]。下一步需要一點想象力:只要兩個陣列排序後的結果相同,輸入的兩個字串就可以通過重排和一一對映變得相同。這樣,問題的核心就是排序。

C語言的stdlib.h中有一個叫qsort的庫函式,實現了著名的快速排序演算法。他的宣告是這樣的:

#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");
}