1185: 零起点学算法92——单词数
Time Limit: 1 Sec Memory Limit: 32 MB 64bit IO Format: %lldSubmitted: 2531 Accepted: 384
[Submit][Status][Web Board]
Description
BobLee 最近忙着考研,话说某一天当他正在看一篇英语阅读时,突然想到想去统计下这篇文章不同单词的个数,由于BobLee很忙,所以想让你帮忙统计一下
Input
有多组数据,每组一行,每组就是一篇小文章。每篇小文章都是由小写字母和空格组成,没有标点符号,遇到#时表示输入结束。(保证每行不超过1000个字符)
Output
每组只输出一个整数,其单独成行,该整数代表一篇文章里不同单词的总数
Sample Input
you are very kind
#
Sample Output
4
参考代码:
Re:先设置一个字符型数组来存储字符,然后逐一将每一个单词存到二维数组中。接着排序,然后统计不同即可
#include<stdio.h> #include<string.h> #include<stdlib.h> #define maxn 10001 char paper[maxn][100]= {'\0'}; char str[maxn]= {'\0'}; int cmp(const void *a,const void *b) { return strcmp((char *)a,(char *)b); } int main() { int i,count,k; int flag; while(gets(str),*str!='#') { flag=1; count=-1; memset(paper,'\0',sizeof(paper)); for( i=0 ; str[i]!='\0' ; i++ ) { if(flag&&str[i]!=' ') { flag=0; count++; k=0; } else if(flag==0&&str[i]==' ') { flag=1; continue; } if(str[i]!=' ') { paper[count][k++]=str[i]; } } memset(str,'\0',sizeof(str)); //for(i=0;i<=count;i++) //puts(paper[i]); if(count>0) qsort(paper,count+1,100*sizeof(char),cmp); /* for(i=0;i<=count;i++) puts(paper[i]); */ int sum=1; for(i=1; i<=count; i++) { if(strcmp(paper[i-1],paper[i])!=0) sum++; } if(count==-1) sum=0; printf("%d\n",sum); } return 0; }
2.map
1 # include <iostream> 2 # include <map> 3 # include <sstream> 4 # include <string> 5 6 using namespace std; 7 8 int main(){ 9 10 map<string,bool> p; 11 string line; 12 while(getline(cin,line)&&line[0]!='#'){ 13 p.clear(); 14 stringstream ss;//创建一个字符串流 15 ss<<line;//把读取的数据方法哦字符串流中 16 string word; 17 while(ss>>word){ 18 p[word] = true; 19 } 20 cout<<p.size()<<endl; 21 } 22 23 return 0; 24 }
3.set
1 # include <iostream> 2 # include <string> 3 # include <set> 4 # include <sstream> 5 6 using namespace std; 7 int main(){ 8 9 set<string> s; 10 string line; 11 12 while(getline(cin,line)&&line[0]!='#'){ 13 stringstream ss; 14 ss<<line; 15 16 string word; 17 while(ss>>word){ 18 s.insert(word); 19 } 20 21 cout<<s.size()<<endl; 22 s.clear(); 23 } 24 25 return 0; 26 }
4.strtok
1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<string> 6 #include<fstream> 7 #include<set> 8 using namespace std; 9 set<string> h; 10 char p[1000005]; 11 int main() 12 { 13 14 while(gets(p)&&p[0]!='#') 15 { 16 h.clear(); 17 char *s=strtok(p," "); 18 while(s!=NULL) 19 { 20 string word=""; 21 word+=s; 22 h.insert(word); 23 s=strtok(NULL," "); 24 } 25 cout<<h.size()<<endl; 26 } 27 28 return 0; 29 }
Re:输入一行由小写字母和空格组成的句子,计算相同单词的个数。 需要注意的几点:
1) 如果一行句子只有空格,则有0个单词。
2) 如果一行句子由空格开头,不能算作单词个数。
3) 如果两个单词之间有n个空格隔开,不能算作单词个数。
4) 如果句子由n个空格结尾,不能算作单词个数。
5) 相同的单词的个数只是一个。