题目:https://vjudge.net/problem/UVA-1339
题意:
给出两个字符串,判断其中一个字符串重新排序后能否通过一定的字母映射得到新的字符串,并使新的字符串与另一个字符串相等
思路:
cnt1[],cnt2[]分别记录两个字符串中每个字母出现的次数,并对这两个数组按照排序,若排序后的结果相同则输出YES,否则NO
sort()默认按照升序排列,以下两种方法可使其按照降序排列:
1.使用greater<int>()
sort(cnt1,cnt1+maxn,greater<int>());
sort(cnt2,cnt2+maxn,greater<int>());
2.自定义一个比较大小的函数
bool cmp(int x,int y)
{
return x > y;
}
sort(cnt1,cnt1+maxn,cmp);
sort(cnt2,cnt2+maxn,cmp);
3.使用stdlib.h中的qsort()库函数,即快速排序算法
const void *是万能指针,可以通过强制类型转化成任意类型的指针(算法竞赛中还是比较常用sort)
int cmp(const void *a,const void *b)
{
return *(int *)a-*(int *)b;
}
qsort(cnt1,maxn,sizeof(int),cmp);
qsort(cnt2,maxn,sizeof(int),cmp);
ac代码:
(我这里的cnt1[]和cnt2[]数组开的有些大,实际上只要存26个就可以了,懒得改了hha)
#include <iostream>
#include <cmath>
#include <string.h>
#include <ctype.h>
#include <algorithm>
#define maxn 100
#define inf 1e+9+10
using namespace std;
typedef long long ll;
int main()
{
char s1[maxn],s2[maxn];
while(scanf("%s",s1)==1)
{
bool flag=true;
int cnt1[maxn]={0},cnt2[maxn]={0};
scanf("%s",s2);
for(int i=0;i<strlen(s1);i++)
cnt1[s1[i]-'A']++;
for(int i=0;i<strlen(s2);i++)
cnt2[s2[i]-'A']++;
sort(cnt1,cnt1+maxn,greater<int>());
sort(cnt2,cnt2+maxn,greater<int>());
for(int i=0;i<=26;i++)
if(cnt1[i]!=cnt2[i])
{
flag=false;
break;
}
if(flag)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}