Problem Description
lily的好朋友xiaoou333最近很空,他想了一件没有什么意义的事情,就是统计一篇文章里不同单词的总数。下面你的任务是帮助xiaoou333解决这个问题。
Input
有多组数据,每组一行,每组就是一篇小文章。每篇小文章都是由小写字母和空格组成,没有标点符号,遇到#时表示输入结束。
Output
每组只输出一个整数,其单独成行,该整数代表一篇文章里不同单词的总数。
Sample Input
you are my friend
#
Sample Output
4
AC代码
#include<stdio.h>
#include<string.h>
int main(){
int n,i,len,k,t,j;
char s[1000];
char str[100][100];
while(gets(s)&&s[0]!='#'){
n=0;
char *p;
p=strtok(s," ");
for(k=0;p!=NULL;k++)
{
strcpy(str[k],p);
p=strtok(NULL," ");
}
//用strtok函数分解字符串------------------------------------
for(i=0;i<k;i++){
for(j=i+1;j<k;j++) {
if(strcmp(str[i],str[j])==0){
n++;//n为重复的单词
break;
}
}
}
printf("%d\n",k-n);
}
return 0;
}
我开始用自己写的函数分解字符串,将每个单词存入二维字符数组中,结果超时:
超时代码:
#include<stdio.h>
#include<string.h>
int main(){
int n,i,len,k,t,j;
char s[1000];
char str[100][100];
while(gets(s)&&s[0]!='#'){
n=0;
len=strlen(s);
k=0;
for(i=0;i<len;i++){
t=0;
if(s[i]!=' '){
while(s[i]!=' '){
str[k][t++]=s[i];
i++;
}
k++;
}
else
i++;
} //将每个单词存入str数组中;
//分解字符串------------------------------------
for(i=0;i<k;i++){
for(j=i+1;j<k;j++) {
if(strcmp(str[i],str[j])==0){
n++;//n为重复的单词
break;
}
}
}
printf("%d\n",k-n);
}
return 0;
}
strtok函数的使用:
Strtok()函数详解:
该函数包含在”string.h”头文件中
函数原型:
char* strtok (char* str,constchar* delimiters );
函数功能:
切割字符串,将str切分成一个个子串
函数参数:
str:在第一次被调用的时间str是传入需要被切割字符串的首地址;在后面调用的时间传入NULL。
delimiters:表示切割字符串(字符串中每个字符都会 当作分割符)。
函数返回值:
当s中的字符查找到末尾时,返回NULL;
如果查不到delimiter所标示的字符,则返回当前strtok的字符串的指针。
#include<stdio.h>
#include<string.h>
int main(void)
{
char buf[]="hello@boy@this@is@heima";
char*temp = strtok(buf,"@");
while(temp)
{
printf("%s ",temp);
temp = strtok(NULL,"@");
}
return0;
}