古老的密碼
阿新 • • 發佈:2018-12-21
題目:
給定兩個長度相同且不超過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"); }