小安的字典

                                                                                          STL应用-——小安的字典set时间限制:
                                                                                                  3 Sec  内存限制: 128 M

题目描述

小安很喜欢英语,她渴望有一本自己独特的字典,但写一本字典并不容易,所以她想出了一个办法:从她最喜欢的一本书中挑出所有不同的单词,按照字典序排列一下就完成了字典的雏形啦。可是,这是一个很大的工程量,为了不让妹子失望,你打算写个程序来完成她的梦想。

你的程序要求按字典序列举出给定输入文本中的所有单词,这个问题中,一个单词的定义是一连串大写或小写字母,单词也可能只有一个字母。同时你还要注意大小写问题,比如“Apple”,“apple” 或 “APPLE”是一样的。

输入

输入不超过5000行的文本(英文),每行不超过200个字母,输入以EOF终止

输出

输出文本中出现的不同单词的列表,按字典序排列,一行一个单词,并且都是小写,可以确定的是文本中的单词不超过5000个。

样例输入

Adventures in Disneyland
Two blondes were going to Disneyland when they came to a fork in the road. The sign read: "Disneyland Left."
So they went home.

样例输出

a
adventures
blondes
came
disneyland
fork
going
home
in
left
read
road
sign
so
the
they
to
two
went
were
when

提示

常规思路可能是 排序 + 分离单词技巧来模拟这个过程,实际上我们有好用的STL容器set能自动帮我们完成字典序排序和去重的过程,当然,巧妙地读入方式以及某些函数可能也会很大程度上减小代码量。

#include<iostream>
#include<cstring>
#include<set>
#include<cstdio>
using namespace std;
int c='a'-'A';
int main()
{
    char jieshou;
    string jieguo,zhongzhuan;
    set<string> a;

    cin.tie(0);
    while((jieshou=getchar())!=EOF) //读入每一个字符
    {
    if(jieshou>='a'&&jieshou<='z')          //把每一个单个字母拼接为一个单词,在用字符串拼接时要注意到相加的先后顺序。
    {
        zhongzhuan=zhongzhuan+jieshou;
    }
    else if(jieshou>='A'&&jieshou<='Z')     //在字符拼接过程中的大小写转换。
    {
        jieshou=jieshou+c;
        zhongzhuan=zhongzhuan+jieshou;
    }
    else                                    //遇到不是字母的字符就把已拼接的单词插入SET当中,SET会自动的排好顺序。
    {
        a.insert(zhongzhuan);
        zhongzhuan=jieguo;
    }

    }

    set<string>::iterator b;

    for(b=a.begin();b!=a.end();b++)         //但是需要注意的是,用getchar接受字符时会把换行符读入,我写的程序中,回车只读入了一个,且在当中被排到了第一的位置,所以
    {                   
        if(b==a.begin())                    //要用b++来不输出这个换行符,也可能是读入了多个换行符,但SET将其去重了。,
        {
            b++;
        }
        cout<<*b<<endl;

    }

    return 0;
}
其它的博主有这题的英文原版题解。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值