题目
给定两个长度一样且不超过100的字符串,判断是否能把其中一个字符串的各个字母重排,之后对26个字母做一个一一映射,使得两个字符串相同。
例如,JWPUDJSTVP重排后可以得到WJDUPSJPVT,之后把每个字母映射到它的前面一个字母,得到VICTORIOUS,输入两个字符串,输出YES或者NO。
代码
#include<algorithm>
#include<cstring>
using namespace std;
bool cmp(const int a,const int b)
{
return a<b;
}
int main()
{
string fst;
string sec;
while(cin >> fst >> sec)
{
int a = fst.length();
int array[26];
int array1[26];
memset(array,0,sizeof(array));
memset(array1,0,sizeof(array1));
for(int i = 0;i < a;i++)
{
array[fst[i] - 'A']++;
array1[sec[i] - 'A']++;
}
sort(array,array+26,cmp);
sort(array1,array1+26,cmp);//cmp函数作为sort函数的参数
int x = 5;
for(int i = 0;i < 26;i++)
{
if(array[i] != array1[i])
{
x = 0;
}
}
if(x == 0)
cout << "NO" << endl;
else
cout << "YES" << endl;
}
}
理解
这个题是书上的第一题,为了讲“把函数作为函数的参数”,所以主要考查的是排序,然而脑子笨的我卡在了映射上。。。。这个给定的两个字符串,打乱顺序,在影射,实际上就是只要两组里对应的字母数相同就可以,所以就直接统计不同的字母有多少个,然后每个字母出现了多少次就可以了。。。