杭电oj HDOJ 2072 单词数

杭电oj HDOJ 2072 单词数

Problem Description

lily的好朋友xiaoou333最近很空,他想了一件没有什么意义的事情,就是统计一篇文章里不同单词的总数。下面你的任务是帮助xiaoou333解决这个问题。

Input

有多组数据,每组一行,每组就是一篇小文章。每篇小文章都是由小写字母和空格组成,没有标点符号,遇到#时表示输入结束。

Output

每组只输出一个整数,其单独成行,该整数代表一篇文章里不同单词的总数。

解题思路

把读取到的字符串以“空格”隔开,统计不同单词的数量

本人的C++解决方案

#include <iostream>
#include <string>
#include <set>
#include <sstream>
using namespace std;

int main()
{
    string sen, word;
    stringstream ss;
    set<string> s;
    while (getline(cin, sen)) {
        if (sen == "#") {
            break;
        }
        ss<<sen;
        // 把读取到的字符串以“空格”隔开
        while (ss>>word) {
            s.insert(word);
        }
        // 统计不同单词的数量
        cout<<s.size()<<endl;
        s.clear();
        // 清空流中错误标记,以免下次使用输入错误信息
        ss.clear();
    }
    return 0;
}

本题涉及到的关于“处理字符串”的内容:(之前在2054题中说过的,这里就不再说了!)

  1. 字符串的读取:cingetline

我们最熟悉的读取方法就是cin,但是对于有“空格”的字符串,cin无法读取到完整的一个字符串,而是读到第一个“空格”就结束了。getline(cin, str)则可以读取完整的字符串,以“回车”为结束标识(不读取“回车”)。

  1. 把字符串分割成单词:stringstream

对于字符串的输入和输出,C++引入了istringstreamostringstreamstringstream三个类,使用时必须引入头文件#include <sstream>

istringstream类用于执行C++风格的串流的输入操作。
ostringstream类用于执行C++风格的串流的输出操作。
stringstream类同时可以支持C++风格的串流的输入输出操作。

stringstream << string:向流中传值
stringstream >> string:向字符串中写值
stringstream.clear():清空流中的错误标记,这里并不是“清空流”。

stringstream创建字符串流时,会把“空格”作为流中字符串的内部分解,刚好可以利用这种特性分割出单词。

  1. 统计不同单词的数量:set容器

set容器是C++中的一种关联容器,其特点是:容器存储同一数据类型的数据、容器中每个元素的值都不同(这就是本题使用它的原因)、容器中的数据会自动排序。

set.clear():清除容器中的所有元素。
set.size():返回容器中的元素个数。
set.insert():向容器中插入元素。

上述相关内容还有许多其他用法,请读者自行寻找查阅。

代码通过HDOJ平台运行通过检查,如发现错误,欢迎指出和纠正,谢谢!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值