单词数
单词数
Description
lily的好朋友xiaoou333最近很空,他想了一件没有什么意义的事情,就是统计一篇文章里不同单词的总数。下面你的任务是帮助xiaoou333解决这个问题。
Input
有多组数据,每组一行,每组就是一篇小文章。每篇小文章都是由小写字母和空格组成,没有标点符号,每篇小文章最多不超过1000个字符,遇到#时表示输入结束。
Output
每组只输出一个整数,其单独成行,该整数代表一篇文章里不同单词的总数。
Sample Input
you are my friend
I am your friend too
#
Sample Output
4
5
下面我说几个比较记录的方法:
比如说:结构体记录,数组清零,java中的数组回收,使他指向空的位置,c语言中的动态分配的free()回收啊,选择排序等等都可以。
我就来一个选择排序标记的,
先来一个时间复杂度大的代码。
代码如下:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int main() { int t; char a[1005]; while(gets(a)!=NULL) { if(a[0]=='#' && strlen(a)==1) break; int t1=0,t2=0; char b[500][20]; memset(b,0,sizeof(b)); for(int i=0;i<strlen(a);i++) { if(a[i]>='a' && a[i]<='z' || a[i]>='A' && a[i]<='Z') b[t1][t2++] = a[i]; else { if(t2==0) continue; //防止第一个非单词破坏存储的位置。 else { b[t1][t2]='\0'; t1++; t2=0; } } } if(t2!=0){ //t2不为零 ,说明最后的一个单词还有,还要存起来。 b[t1][t2]='\0'; //把最后记录的单词标记存起来 t1++; } for(int i=0;i<t1;i++){ int k=i; for(int j=i+1;j<t1;j++){ if(strcmp(b[k],b[j])==0){ b[k][0] = '\0'; //出现了一个一模一样的就把一个清零。 k = j; } } } int ans=0; for(int i=0;i<t1;i++){ if(strlen(b[i])!=0) //比较长度就可以了, ans++; } printf("%d\n",ans); } return 0; }
再来一个时间复杂度较少的。
代码如下:
#include<stdio.h> #include<string.h> int main() { char a[1000],b[200][200]; int i,j,t,k,len,q; while(gets(a)!=NULL) { len=strlen(a); if(len==1 && a[0]=='#') break; j=t=0; for(i=0;i<len;i++) { if(a[i]!=' ') b[j][t++]=a[i]; else { b[j][t]='\0'; if(t!=0) j++; t=0; } } b[j][t]='\0'; t=0; for(i=0;i<=j;i++) { q=0; for(k=i+1;k<=j;k++) if(strcmp(b[i],b[k])==0) q=1; if(q==0) t++; } printf("%d\n",t); } return 0; }