单词数
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;
}