第IV章アルゴリズムコンテストエントリー古典研究ノート2
関数のパラメータの関数として、
例4-1古いパスワード(古代の暗号、NEERC 2004、UVa1339)
同じ長さを与えられていないと我々は文字列の並べ替えかどうかを判断することができ、及び26は、文字-1のマッピング2つの文字列が同じであるように作るそれぞれの2つの以下の文字列100、。例えば、JWPUDJSTVPは、それが文字にマッピングされ、各文字の前に、再配置WJDUPSJPVT後に得ることができる(B-> A、C> B 、...、Z-> Y、A-> Z)は、 VICTORIOUS得ました。二つの入力文字列、出力YESまたはNO
タイトル分析:
文字を並べ替えることができるよう、各文字の位置は重要ではありません、回数は、各文字が表示され
、二つの文字列の各文字が表示されますの数をカウント①二つの配列CNT1 [26]、CNT2 [26 ]
私たちは、②の後にソートした後、同じ結果をソートし、我々は再配置によって入力された2つの文字列がその中に質問の核心となるように同じ1のマッピングになることができます説明しましたソート
C言語ライブラリSTDLIB.Hは、よく知られた高速なソートアルゴリズムを達成するためのqsortと呼ばれる機能があります。理解します
void qsort ( void * base, size_t num, size_t size, int ( * comparator ) ( const void *, const void * ) );
/*前3个参数不难理解,分别是待排序的数组起始地址、元素个数和每个元素的大小。最 后一个参数比较特别,是一个指向函数的指针,该函数应当具有这样的形式:int cmp(const void *, const void *) { … }
*/
一定のポイント「ユニバーサル」ポインタ:CONST void *型、必須のポインタのいずれかのタイプに変換することができます。
#include<iostream>
#include<stdlib.h>
#include<cstring>
using namespace std;
int cmp(const void* a,const void *b)
{
return *(int*)a-*(int*)b;
//(int*)a:类型转化 变成int类型的指针,然后*这个指针,得到这个变量
}
int main()
{
char s1[105],s2[105];
while(cin>>s1>>s2)
{
int cnt1[26]={0},cnt2={0};
int len=strlen(s1),flag=1;
for(int i=0;i<len;i++)
{
cnt1[s1[i] - 'A']++, cnt2[s2[i] - 'A']++;
}
qsort(cnt1, 26, sizeof(int), cmp);//void qsort(void *base, sieze_t num, size_t size, int(*comparator)(const void* ,const void*) );
qsort(cnt2, 26, sizeof(int), cmp);// 数组名字 数组大小 单位长度 比较函数
for (int i = 0; i < 26; i++)
if (cnt1[i] != cnt2[i]) { flag = 0; break; }
if (flag)printf("YES\n");
else printf("NO\n");
}
return 0;
}