题解报告:hdu 2072 单词数
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2072
题目:
Problem Description
lily的好朋友xiaoou333最近很空,他想了一件没有什么意义的事情,就是统计一篇文章里不同单词的总数。下面你的任务是帮助xiaoou333解决这个问题。
Input
有多组数据,每组一行,每组就是一篇小文章。每篇小文章都是由小写字母和空格组成,没有标点符号,遇到#时表示输入结束。
Output
每组只输出一个整数,其单独成行,该整数代表一篇文章里不同单词的总数。
Sample Input
you are my friend
#
Sample Output
4
解题思路:这道题的思路就是计数每一行不同单词的个数,由此想到set关联式容器(是一个集合,集合中元素具有不重复性),set是C++标准库中的一种关联容器。所谓关联容器就是通过键(key)来读取和修改元素。与map关联容器不同,它只是单纯键的集合。此题通过cin.get()函数来读取单个字符,每次读取单词的第一个字符,接下来循环读入字符保存在s字符串中,判断条件为当前字符不是空格和换行符;当不满足条件即输入完一个单词,这样通过s.length()来检查是否单词长度为0,不为0就可向容器中插入该单词,最后如果遇到'\n',即该组已经输入完毕,就得输出有多少个单词数了。
AC代码:
解法一:
1 #include<bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 set<string>st;//一个保存string的set集合 6 string s; 7 char c; 8 while((c=cin.get())!='#'){//循环读入单词的第一个字符,直到不为'#'为止,控制文章 9 s.clear();//清除要保存单词的s字符串 10 while(c!=' '&&c!='\n'){//循环读取字符(为一个单词) 11 s+=c; 12 c=cin.get();//获取下一个字符 13 } 14 if(s.length())//表示如果此时string中s是有长度,就将s插入到容器中 15 st.insert(s); 16 if(c=='\n'){//遇到'\n'的话就是该输出个数和换行了 17 cout<<st.size()<<endl;//输出容器的大小 18 st.clear();//清除st容器 19 } 20 } 21 return 0; 22 }
解法二:(C语言写法)
1 #include<bits/stdc++.h> 2 using namespace std; 3 char a[100001],b[2000][1000];//a数组要开大点,b数组用来保存每行的单词 4 int main() 5 { 6 int i,j,k,g,t; 7 while(gets(a)){ 8 if(strcmp(a,"#")==0)break; 9 memset(b,0,sizeof(b));//清空 10 i=j=k=0,g=strlen(a); 11 while(i<g){//扫描每行的字符串 12 if(a[i]==' '){ 13 while(a[i]==' '&&a[i]!='\0')i++;//清空0字符 14 } 15 else{ 16 while(a[i]!=' '&&a[i]!='\0'){ 17 b[k][j]=a[i];//单个字符赋予二维数组 18 j++,i++; 19 } 20 b[k][j]='\0';//完整的字符串 21 k++,j=0;//下一个单词 22 } 23 } 24 t=k;//表示总共有单词的个数 25 for(i=0;i<k-1;i++){//循环比较 26 for(j=i+1;j<k;j++){ 27 if(strcmp(b[i],b[j])==0){ 28 t--;//如果有相同的话t就减1 29 break;//跳出操作相当于删掉下标为i的单词,保留j位置的单词,因为后面还要用到j来与其后面的比较 30 } 31 } 32 } 33 cout<<t<<endl;//输出单词个数 34 } 35 return 0; 36 }