ECNU OJ 2896 随机排序

给定一组以一个空格分隔的只含大小写字母的字符串。与普通字典序不同,按照给定的字母顺序对这组字符串排序。设两个字符串的字母不会完全相同。如: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]);
    }
}

 

 

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注