题解报告: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 }

 

posted @ 2018-03-27 19:21  霜雪千年  阅读(404)  评论(0编辑  收藏  举报