单词排序

GitHub跳转原题关系图返回列表

按空白切分单词,用 set 去重后按 Python 字符串字典序排序。

OJ: noi_openjudge

题目 ID: ch0110-10

难度:入门

标签:排序字符串集合python

日期: 2026-07-30 23:01

题意

输入一行由一个或多个空格分隔的单词,区分大小写,去重后按字典序逐行输出。

思路

split() 会把连续空白都视为分隔符,正好适合本题。先用 set 去重,再对集合调用 sorted。Python 字符串默认按字典序比较,并区分大小写。

代码

Python代码

python
words = sorted(set(input().split()))

print(*words, sep="\n")

C++代码

cpp
#include <cstdio>
#include <cstring>

#define cpy(a,b) memcpy(a,b,sizeof(a));


char word[200][100];
int cnt=0;
void init(){
    char t[100];
    int i;
    while( scanf("%s",t) != EOF){
        bool find_flag = false;
        for(i=1;i<=cnt;i++){
            int cmp = strcmp(t,word[i]);
            if(cmp == 0){
                find_flag = 1;
                break;
            }
        }
        if( find_flag)
            continue;

        cnt++;
        memcpy(word[cnt], t, sizeof(t));
    }
}

// >=
bool greater(char s1[],char s2[]){
    int ans = strcmp(s1, s2);
    if( ans == 0) return 1;
    if( ans > 0)
        return 1;
    return 0;
}

void xchg( char s1[],char s2[]){
    char t[100];
    memcpy(t, s1, sizeof(t));
    memcpy(s1, s2, sizeof(t));
    memcpy(s2, t, sizeof(t));
}

void quick_sort(int l,int r){
    if( l >= r) return ;

    char key[100];
    cpy(key,word[l]);
    int i = l,j = r;

    while(i != j){
        while( i < j && greater(word[j], key))
            j--;
        while( i < j && greater( key,word[i]))
            i++;
        if( i < j)
            xchg(word[i],word[j]);
    }
    cpy(word[l],word[i]);
    cpy(word[i],key);

    quick_sort(l, i-1);
    quick_sort(i+1, r);

}


int main(){
    init();
    quick_sort(1, cnt);
    int i;
    for (i=1;i<=cnt;i++){
        printf("%s\n",word[i]);
    }
    return 0;
}

复杂度

设不同单词数为 mm,时间复杂度为 O(n+mlogm)O(n + m \log m),空间复杂度为 O(m)O(m)

总结

splitsetsorted 依次对应切分、去重、排序三个独立步骤。