单词数

单词数

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;
}

posted @ 2017-06-09 21:24  让你一生残梦  阅读(306)  评论(0编辑  收藏  举报