您的位置:首页 > 其它

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

2017-08-25 12:52 417 查看
题目大意:

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

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

实现:

#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的无重复元素的性质(题目就是要求不重复输出)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  UVa 10815 set