题目:单词数
Problem Description
lily的好朋友xiaoou333最近很空,他想了一件没有什么意义的事情,就是统计一篇文章里不同单词的总数。下面你的任务是帮助xiaoou333解决这个问题。
Input
有多组数据,每组一行,每组就是一篇小文章。每篇小文章都是由小写字母和空格组成,没有标点符号,遇到#时表示输入结束。
Output
每组只输出一个整数,其单独成行,该整数代表一篇文章里不同单词的总数。
Sample Input
you are my friend
Sample Output
4
[题目链接]http://acm.hdu.edu.cn/showproblem.php?pid=2072
思路:
这道题,我本来只是去计算行中究竟有多少个单词,提交后,却发现我错了,再看一下题目,原来是要我们计算有多少个不同的单词。
这个我确实不懂要怎么做了,去网上参考别的代码后,学到了很多,我还没怎么学过c++,这一道题,让我了解了c++几个库里的几个非常有用的函数,真是收获很多啊。
方法一:用map来解决
map当中的键-值对,其中键,也就是key的唯一性(不可重复),刚好可以避免相同单词的重复计算
AC代码:
#include<iostream>
#include<map>
#include<sstream>
#include<string>
using namespace std;
int main()
{
map<string,bool>d;//定义一个名为d的map对象,key为string型,value为bool型
string s;//定义一个字符串
while(getline(cin,s)&&s[0]!='#')//输入一行
{
d.clear();//清空d
stringstream dd;//创建一个字符串流
dd<<s;//将读取的字符串放入字符串流中
string word;
while(dd>>word)//向word中写入值
d[word]=true;//向d中写入key和value(每个key都是唯一的,不可重复的)
cout<<d.size()<<endl;//用size输出key的个数
}
return 0;
}
方法二:用set来解决
set和map都是关联容器,set和map都有一个特点是key的唯一性,同样都适应我们这道题的要求。但是set只有一个关键字,而不像map的关键字是键/值得集合
AC代码:
#include<iostream>
#include<set>
#include<sstream>
#include<string>
using namespace std;
int main()
{
set<string>d;//定义一个名为d的set对象
string s;
while(getline(cin,s)&&s[0]!='#')
{
d.clear();//删除set容器中的所有的元素
stringstream dd;
dd<<s;
string w;
while(dd>>w)
d.insert(w);//把w放入d中
cout<<d.size()<<endl;
}
return 0;
}