【UVA】 Andy's First Dictionary(模拟)

本文介绍了一种在处理英文文章时遇到的问题——单词间缺少空格导致的误判,并提供了两种解决方案,一种使用set存储单词并输出,另一种利用string特性逐字符判断。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接

题意很简单,就是把一篇文章中的所有单词不重复的按字典序升序输出。
这道题卡了一下午,就是有一个小的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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值