例题 5-3 安迪的第一个字典(Andy's First Dictionary) UVa 10815

题目大意:

输入一个文本,找出所有不同的单词(连续的字母序列),按照字典序从小到大输出,单词不区分大小写(算一个) 

输出时 全部按照小写格式输出。


实现:

#include<iostream>
#include<vector>
#include<string>
#include<set>
#include<cstring> 
#include<sstream>
using namespace std;
string to_upper(string str)//字符串小写转换为大写(原字符串不改变)
	{
		string a;
		for(int i = 0; i < str.size(); i++){
			if(str[i] != '\0'){
				a += toupper(str[i]);
			}
		}
		return a;
	}
struct Rule{//定义排序规则(此题可以不用,默认按照字典序)
	bool operator()(const string &a, const string &b){
		return to_upper(a) < to_upper(b);
	}
};
int main()
	{
	//	freopen("C:\\Users\\zhangwei\\Desktop\\input.txt","r",stdin); 
		string s;
		string buf;
		set<string,Rule> a;
		while(cin >> s){
			buf.clear();//每次需要清空
			for(int i = 0; i < s.length(); i++ ){
				if(isalpha(s[i]))
					buf += tolower(s[i]);
				else
					buf += ' ';//(一定要有) 遇到非字母时候换成空格		
			}
			stringstream ss(buf); //读到 字符流中
			while(ss >> buf) a.insert(buf);//从 字符流中读取单词(以空格或换行符区分)
		}
		set<string,Rule>::iterator it;
		for(it = a.begin(); it != a.end(); it++ ){
			cout << *it<<endl;
		}	

		return 0;
	}


另一种方法:

		while(cin >> s){
			for(int i = 0; i < s.length(); i++ ){
				if(isalpha(s[i]))
					s[i] = tolower(s[i]);//直接改变单词本身大小写
				else
					s[i] = ' ';//遇到非字母换为空格
			}
			stringstream ss(s);
			while(ss >> buf) a.insert(buf);
		}

注意:

(1)第一种 利用 string buf直接相加的情况(不用空格代替非字母) 虽然大多数样例可以通过 但是 例如 I"love you

         就会在同一行输出I  love (事实上要求每个单词占一行) 所以这是错误的。

(2)这里利用了set的无重复元素的性质(题目就是要求不重复输出)。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值