题目大意:
输入一个文本,找出所有不同的单词(连续的字母序列),按照字典序从小到大输出,单词不区分大小写(算一个)
输出时 全部按照小写格式输出。
实现:
#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的无重复元素的性质(题目就是要求不重复输出)。