题意很简单,就是把一篇文章中的所有单词不重复的按字典序升序输出。
这道题卡了一下午,就是有一个小的bug,他给的数据中有些单词是这样连接起来的:
apple?banana
,就是说两个单词中间没有空格,其实英文文章这个地方是要空格的。
下面就是卡了这个bug的代码。
这个代码在处理apple?banana
这种情况的时候,就会处理成一个applebanana
,显然这样是不对的。
WA代码:
#include <iostream>
#include <set>
#include <string>
using namespace std;
int main(void){
string str;
set<string> s;
set<string>::iterator it;
while(cin>>str){
for(int i=0;i<str.size();i++){
if(str[i] >= 'A' && str[i] <= 'Z') str[i] += 32;
if(str[i] < 'a' || str[i] > 'z') str.erase(i,1),i--;
}
if(str.size() != 0) s.insert(str);
}
for(it = s.begin();it != s.end();++it) cout<<*it<<endl;
return 0;
}
然后就换了思路,利用string可以直接通过+
在尾部添加字符。用getchar()读取每一个字符,如果不是字母就说明这是一个单词的结束另一个单词的开始。
AC代码:
#include <iostream>
#include <set>
#include <string>
using namespace std;
int main(void){
char ch;
string s;
set<string> ssr;
set<string>::iterator it;
while((ch = getchar()) != EOF){ //记得加括号,不然ch永远是等于TRUE
if(isalpha(ch)){ //lower letter
ch = tolower(ch);
s += ch;
}
else{
if(s.size() != 0){
// cout<<s<<endl;
ssr.insert(s);
s.clear();
}
}
}
// cout<<ssr.size()<<endl;
for(it = ssr.begin();it != ssr.end();++it)
cout<<*it<<endl;
return 0;
}