单词数
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 32344 Accepted Submission(s): 7625
Problem Description
lily的好朋友xiaoou333最近很空,他想了一件没有什么意义的事情,就是统计一篇文章里不同单词的总数。下面你的任务是帮助xiaoou333解决这个问题。
Input
有多组数据,每组一行,每组就是一篇小文章。每篇小文章都是由小写字母和空格组成,没有标点符号,遇到#时表示输入结束。
Output
每组只输出一个整数,其单独成行,该整数代表一篇文章里不同单词的总数。
Sample Input
you are my friend #
Sample Output
4
很坑的题,要考虑全是空格和直接回车的情况。
#include<stdio.h>
#include<string.h>
int main()
{
int i,j,l,n;
int word;//总单词数
int sameword;//重复的单词数
char str1[1010],str2[110][1010];
while(gets(str1)&&(str1[0]!='#'))
{
l=strlen(str1);
memset(str2,'\0',sizeof(str2));
if(l==0)//直接回车的情况
{
printf("0\n");
continue;
}
n=l-1;
for(i=0;i<l;i++)
{
if(str1[i]!=' ')
{
n=i;
break;
}
}
if(n==l-1)//全是空格的情况
{
printf("0\n");
continue;
}
j=0;word=1;
for(i=n;i<l-1;i++)
{
if(str1[i]!=' ')
{
str2[word][j++]=str1[i];
}
if(str1[i]==' '&&str1[i+1]!=' ')//新增单词
{
word++;j=0;
}
}
if(str1[l-1]!=' ')
{
str2[word][j]=str1[l-1];
}
sameword=0;
for(i=1;i<=word;i++)
{
for(j=i+1;j<=word;j++)
{
if(strcmp(str2[i],str2[j])==0)
{
sameword++;
break;
}
}
}
printf("%d\n",word-sameword);
}
return 0;
}
更新时间 2015.6.1 一遍过了
#include <cstdio>
#include <cstring>
#define MAX 10000+10
using namespace std;
char str[MAX][100];
char word[MAX];
void find(char *s)
{
int i, j, l = strlen(s);
int vis[MAX];
if(l == 0)//空格
{
printf("0\n");
return ;
}
for(i = 0; i < l; i++)//去掉前面空格
if(s[i] != ' ') break;
int num = 0;
int t = 0;
memset(str, '\0', sizeof(str));
for(; i < l-1; i++)
{
if(s[i] != ' ')
str[num][t++] = s[i];
if(s[i] != ' ' && s[i+1] == ' ')
{
num++; t = 0;
}
}
if(s[l-1] != ' ')
str[num++][t++] = s[l-1];
int sum = num;
memset(vis, 0, sizeof(vis));
for(i = 0; i < num; i++)
{
if(vis[i]) continue;
for(j = 0; j < num; j++)
{
if(i == j) continue;
if(vis[j]) continue;
if(strcmp(str[i], str[j]) == 0)
{
sum--;
vis[j] = 1;
}
}
}
printf("%d\n", sum);
}
int main()
{
while(gets(word), word[0] != '#')
{
find(word);
}
return 0;
}