给定一组以一个空格分隔的只含大小写字母的字符串。与普通字典序不同,按照给定的字母顺序对这组字符串排序。设两个字符串的字母不会完全相同。如:Hat、hat、HAt 等不会同时出现。
例如:字母顺序为 QWERTYUIOPASDFGHJKLZXCVBNM 时,一组字符串 hat cat bat book bookworm Dallas Austin Houston fire firefox fumble 的排序结果为:Austin Dallas fumble fire firefox Houston hat cat book bookworm bat。
Input
每组数据由 2 行组成,第 1 行为字母顺序(26 个大写字母),第 2 行是需要排序的一组字符串(只含大小写字母,长度不大于 20)。
数据不多于 100 组。需要排序的一组字符串中包含的字符串个数至少 1 个,至多 100 个。
Output
对于每一组数据,输出排序后的字符串。字符串之间输出一个空格,最后一个字符串后面没有空格,而是输出一个换行符。
#include <stdio.h> int p[26]; //按给定的字母循序对字符串排序,如果第一个字符相等,则比较第二个字符 int cmp (const void *a, const void *b) { char *s1, *s2; //s1,s2用来遍历字符串 char ch1, ch2; //ch1,ch2用来指向对应的大写字母 s1 = (char *)a; s2 = (char *)b; //--------------------------------重要--------------------------------- while (*s1 && *s2){ ch1 = (*s1) >= 'a' ? *s1 - 'a' + 'A' : *s1; // 转化为大写 ch2 = (*s2) >= 'a' ? *s2 - 'a' + 'A' : *s2; if (p[ch1-'A'] != p[ch2-'A']) //字符不相等,按顺序表比较 return p[ch1-'A'] - p[ch2-'A']; //升序 else { //字符相等,进入下个字符比较 s1++; s2++; } if (*s1 == 0) //第一个字符串结束,而第二个未结束则,第一个字符串在前 return -1; else //第一个字符串未结束,而第二个结束,第一个字符串在后 return 1; //--------------------------------重要--------------------------------- } } int main(void) { char s[27]; while(~scanf("%s\n",s)){ //读入字母顺序表 for (int i = 0; i < 26; i++) p[s[i]-'A'] = i; char str[2200]; char a[100][21]; gets(str); int count = 0; int i = 0; //--------------------------------重要--------------------------------- while (true){ //根据空格分割出每个字符串,把字符串存储在二维数组 int j = 0; while (str[i]!= ' ' && str[i]) a[count][j++] = str[i++]; a[count][j] = '\0'; count++; //统计字符串个数 if (!str[i]) break; else i++; } //--------------------------------重要--------------------------------- qsort(a, count, sizeof(a[0]), cmp); // qsort(首地址,排序的字符创个数,每一个数组元素大小,比较函数) for (int i = 0; i < count - 1; i++) printf("%s ", a[i]); printf("%s\n", a[i]); } }