FZU Problem 2027 单词问题

Problem 2027 单词问题

Accept: 722 Submit: 2623 Time Limit: 1000 mSec Memory Limit : 32768 KB

img Problem Description

给出一个完整的句子,这个句子中不包含不可见字符或者空格,于是在这个句子中有许多不同的单词。一个单词是指一串连续的最长的英文字母(大写或小写)。例如"#abc#"中,“abc"就是一个单词,而"ab”,"bc"都不算单词。

img Input

输入包含多组数据 输入数据第一行是一个句子,只包含可见字符(不包含空格)。句子长度不超过 100。

img Output

按单词出现的顺序输出不同的单词。如果一个单词出现多次则只有第一次出现时输出。

img Sample Input

Orz_YaYaMao_Orz_Daxia_Orz_EveryOne

img Sample Output

Orz

YaYaMao

Daxia

EveryOne

img 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();
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值