杭电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题中说过的,这里就不再说了!)
我们最熟悉的读取方法就是cin
,但是对于有“空格”的字符串,cin
无法读取到完整的一个字符串,而是读到第一个“空格”就结束了。getline(cin, str)
则可以读取完整的字符串,以“回车”为结束标识(不读取“回车”)。
对于字符串的输入和输出,C++引入了istringstream
、ostringstream
、stringstream
三个类,使用时必须引入头文件#include <sstream>
。
istringstream
类用于执行C++风格的串流的输入操作。
ostringstream
类用于执行C++风格的串流的输出操作。
stringstream
类同时可以支持C++风格的串流的输入输出操作。
stringstream << string
:向流中传值
stringstream >> string
:向字符串中写值
stringstream.clear()
:清空流中的错误标记,这里并不是“清空流”。
用stringstream
创建字符串流时,会把“空格”作为流中字符串的内部分解,刚好可以利用这种特性分割出单词。
set
容器是C++中的一种关联容器,其特点是:容器存储同一数据类型的数据、容器中每个元素的值都不同(这就是本题使用它的原因)、容器中的数据会自动排序。
set.clear()
:清除容器中的所有元素。
set.size()
:返回容器中的元素个数。
set.insert()
:向容器中插入元素。
上述相关内容还有许多其他用法,请读者自行寻找查阅。
代码通过HDOJ平台运行通过检查,如发现错误,欢迎指出和纠正,谢谢!