杭电2072——单词数

题目:单词数

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;
 } 

猜你喜欢

转载自blog.csdn.net/weixin_43846755/article/details/87902880