单词数
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 68521 Accepted Submission(s): 17259
Problem Description
lily的好朋友xiaoou333最近很空,他想了一件没有什么意义的事情,就是统计一篇文章里不同单词的总数。下面你的任务是帮助xiaoou333解决这个问题。
Input
有多组数据,每组一行,每组就是一篇小文章。每篇小文章都是由小写字母和空格组成,没有标点符号,遇到#时表示输入结束。
Output
每组只输出一个整数,其单独成行,该整数代表一篇文章里不同单词的总数。
Sample Input
you are my friend
#
Sample Output
4
字符串处理,就是统计单词,遇到空格就切下一个。不过不同单词有点麻烦,平常没用过getline,这个还真不会,最后还是学了一下别人用set,大佬的代码很简单,我稍微做了修改,就拿这个来说吧。https://blog.csdn.net/jocelyn_ln/article/details/52116337
//#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<set>
/*
为什么用set呢,因为set中重复的元素不会插入,
也就是说相同的单词只插入一次,
这样就能很清楚的算出不同单词的个数了。
*/
using namespace std;
const int maxn = 1e4 + 10;
int main()
{
set<string> st;//set容器
string s,str;
int flag = 0;//初始化为零
while(getline(cin,s)) //输入s
{
st.clear();//清楚所有元素;
if(s=="#")
{
exit(0);
}
if()
for(int i = 0;i < s.size();i++) //当前单词
{
str=""; //初始化
flag=0; //初始化
while(s[i]>='a'&&s[i]<='z')
{
str+=s[i]; //循环结束后str就是当前字母
flag=1; //给当前单词标记
i++;
}
if(flag==1) //将标记过的单词插入
{
st.insert(str); //insert()在容器中插入元素
str=""; //清空str
}
}
cout<<st.size()<<endl;
}
return 0;
}
先说一下getline吧,它有一个很好的特性,
只有getline函数动作完毕时,while才会执行内部的循环
例如:
while(getline(cin,str))
{
cout<<str<<endl;
}
只有当所有输入结束时str才会输出,
set有以下两个特性:
第一,它里面的元素不会重复,输入1 1 2 2 3 3 4 4再输出,结果就是1 2 3 4.
第二,它里面的元素是有序的,自动从小到大排列清楚。
下面是部分用法
begin() 返回set容器的第一个元素
end() 返回set容器的最后一个元素
clear() 删除set容器中的所有的元素
empty() 判断set容器是否为空
max_size() 返回set容器可能包含的元素最大个数
size() 返回当前set容器中的元素个数 (相同的不算在内,因为根本没存进去)
rbegin 返回的值和end()相同
rend() 返回的值和rbegin()相同