Problem Description
lily的好朋友xiaoou333最近很空,他想了一件没有什么意义的事情,就是统计一篇文章里不同单词的总数。下面你的任务是帮助xiaoou333解决这个问题。
Input
有多组数据,每组一行,每组就是一篇小文章。每篇小文章都是由小写字母和空格组成,没有标点符号,遇到#时表示输入结束。
Output
每组只输出一个整数,其单独成行,该整数代表一篇文章里不同单词的总数。
Sample Input
you are my friend#
Sample Output
4
Author
Lily
Source
思路:现在字符串末尾添加一个空格,然后以空格为分隔符,分成一个个的单词存入数组中间,然后计算数组中间有多少是重复的,总单词数量减去重复的数量就是答案。
注意:"a aa a aa "这种字符串wa了一发。
代码:
#include<stdio.h>
#include<string.h>
char a[1200],b[1200][1200];
int main()
{
while(gets(a)&&strcmp(a,"#"))
{
int i,j,k=0,t=0,num=0,l=strlen(a);//最开始的时候所有l都是用strlen(a)表示,然后wa了一发
a[l]=' ';
memset(b,0,sizeof(b));
for(i=0; i<l+1; i++)
{
if(a[i]==' '&&i>k)
{
while(a[k]==' ')
k++;
if(k>=i)
continue ;
for(j=k; j<i; j++)
b[t][j-k]=a[j];
t++;
k=i+1;
}
}
for(i=1; i<t; i++)
{
for(j=0; j<i; j++)
{
if(strcmp(b[i],b[j])==0)//判重
{
num++;
break;
}
}
}
printf("%d\n",t-num);
}
return 0;
}
还有一种c++的代码简单很多:
#include<iostream>
#include<sstream>
#include<set>
using namespace std;
int main()
{
string s,w;
while(getline(cin,s)&&s!="#") //注意c++中string可以比较,所以s!="#"这里是双引号
{
set<string>word; //set容器中不会有重复的元素,所以用set容器判重
stringstream ss(s); //将一串字符串转化为字符流(字符串中的空格将被视为间隔符)
while(ss>>w) //将字符流一个个传递给w
word.insert(w); //将w插入容器中
cout<<word.size()<<endl; //输出容器的大小
}
return 0;
}