Problem 2027 单词问题
Accept: 722 Submit: 2623 Time Limit: 1000 mSec Memory Limit : 32768 KB
Problem Description
给出一个完整的句子,这个句子中不包含不可见字符或者空格,于是在这个句子中有许多不同的单词。一个单词是指一串连续的最长的英文字母(大写或小写)。例如"#abc#"中,“abc"就是一个单词,而"ab”,"bc"都不算单词。
Input
输入包含多组数据 输入数据第一行是一个句子,只包含可见字符(不包含空格)。句子长度不超过 100。
Output
按单词出现的顺序输出不同的单词。如果一个单词出现多次则只有第一次出现时输出。
Sample Input
Orz_YaYaMao_Orz_Daxia_Orz_EveryOne
Sample Output
Orz
YaYaMao
Daxia
EveryOne
Source
福州大学第八届程序设计竞赛
解决方案
本题当然可以用链表来保存出现过的单词,但是c++有个叫map的轮子,可以利用其关键字(key)只能唯一存在的特性,来判断当前单词是否出现过。
map的特性和用法网上写得很多很详尽,而且不难,所以此处不再赘述。
map有点像数组,可以像操作数组一样利用map[i]来选中map中的元素,但这种方法有时候会出现奇怪的错误,特别是关键字是字符串的时候。见博文http://www.cnblogs.com/icode-girl/p/5362718.html
所以操作map时,最好使用map.insert()和迭代器iterator
#include<iostream>
#include<map>
#include<cstring>
using namespace std;
char str[105];
char word[105];
int main() {
int i, len, j;
map<string, int> m;
map<string, int>::iterator it;
while (scanf("%s", str) != EOF) {
len = strlen(str);
j = 0;
for (i = 0; i <= len; i++) {
if (str[i] >= 'A'&&str[i] <= 'Z' || str[i] >= 'a'&&str[i] <= 'z') {
word[j] = str[i];
++j;
}
//注意此处应该判断单词是否存在,否则出现多个非字母字符时打印多个换行符
else if(j > 0){
word[j] = '\0';
j = 0;
it = m.find(word);
if (it == m.end()) {
m.insert(map<string, int>::value_type(word, 1));
printf("%s\n", word);
}
}
}
m.clear();
}
}