Problem Description
lily的好朋友xiaoou333最近很空,他想了一件没有什么意义的事情,就是统计一篇文章里不同单词的总数。下面你的任务是帮助xiaoou333解决这个问题。
Input
有多组数据,每组一行,每组就是一篇小文章。每篇小文章都是由小写字母和空格组成,没有标点符号,遇到#时表示输入结束。
Output
每组只输出一个整数,其单独成行,该整数代表一篇文章里不同单词的总数。
Sample Input
you are my friend
#
Sample Output
4
解题思路
- 对数据进行遍历,获取单词存放至容器中。
- 每次获取单词时都要检查该单词是否已经在容器中存在。
- 若存在,则不加入容器,反之,则加入。
经验总结
- 计数的是不同单词的总数。
- 每次用来对比的单词字符串需重置或在其后面加‘\0’。
- 每个单词之间的间隔可能不止一个空格。
- 单词的大小在20以上。
AC代码(C++)
#include<set>
#include<iostream>
using namespace std;
int main() {
char c;
string temp;
set<string> words;
while ((c = getchar()) != '#') {
if (c != ' ' && c != '\n')
temp.insert(temp.end(), c);
else {
if (!temp.empty()) {
words.insert(temp);
temp.clear();
}
}
if (c == '\n') {
cout << words.size() << endl;
words.clear();
}
}
return 0;
}
AC代码(C)
#include <stdio.h>
#include <string.h>
const int maxn = 10010;
char words[maxn][20], str[maxn], word[maxn];
int num = 0, index = 0;
bool check() {
for (int i = 0; i < num; ++i)
if (strcmp(words[i], word) == 0)
return false;
return true;
}
void update() {
word[index] = '\0';
if (check() && strlen(word))
strcpy(words[num++], word);
index = 0;
}
int main() {
while (gets(str) && strcmp(str, "#") != 0) {
num = 0;
for (int i = 0; i < strlen(str); ++i) {
if (str[i] != ' ')
word[index++] = str[i];
else
update();
}
update();
printf("%d\n", num);
}
return 0;
}