1. 程式人生 > >例題:古老的密碼(UVa1339)

例題:古老的密碼(UVa1339)

題目:古老的密碼

題目描述:

給定兩個長度一樣且不超過100的字串,判斷是否能把其中一個字串的各個字母重排,之後對26個字母做一個一一對映,使得兩個字串相同

例如,JWPUDJSTVP重排後可以得到WJDUPSJPVT,之後把每個字母對映到它的前面一個字母,得到VICTORIOUS,輸入兩個字串,輸出YES或者NO

題目分析:

因為字母可以重排,每個字母的位置並不重要,重要的是每個字母出現的次數

①統計兩個字串每個字母出現的次數,得到兩個陣列cnt1[26],cnt2[26]

②之後我們排序下,排序之後結果相同,說明我們輸入的兩個字串就可以通過重排一一對映變得相同了所以本道題的核心在與【排序】

關於排序:

  • C語言中stdlib.h中有一個叫qsort的庫函式
void qsort(void base, size_t num, size_t size, int(cmp)(const void , const void ));

如果排序是整型陣列的話,

int cmp(const void *a, const void *b)
{
    return *(int *)a - *(int *)b;
}

參考程式碼:

 #include<stdio.h>
 #include<stdlib.h>
 #include<string.h>
#define maxn 100+10 int cmp(const void *a,const void *b) { return *(int *)a - *(int *)b; } int main() { char a[maxn]; char b[maxn]; while(scanf("%s%s",a,b) == 2) { int len=strlen(a); int cnt1[26],cnt2[26]; memset(cnt1,0,sizeof(cnt1)); memset(cnt2,0,sizeof(cnt2)); for
(int i=0;i<len;i++) { cnt1[a[i] - 'A']++; cnt2[b[i] - 'A']++; } //排序 qsort(cnt1,26,sizeof(cnt1[0]),cmp); qsort(cnt2,26,sizeof(cnt2[0]),cmp); for(int i=0;i<26;i++) { if(cnt1[i]!=cnt2[i]) { printf("NO\n"); return 0; } } printf("YES\n"); } return 0; }