B3927 [GESP202312 四级] 小杨的字典 题解

· · 题解

考虑使用 map 来做。

思路很简单,先录入词典条目,再输入字符串 S,然后去查找单词,是标点符号则直接输出,不在词典内则输出 UNK

查找单词是否存在可以用 find() 函数,find(key) 为返回键是 key 的映射的迭代器,成功返回迭代器指向要查找的元素,失败返回的迭代器指向 end。

代码:

#include<iostream>
#include<map>
using namespace std;
int main(){B3927
    int n;
    map<string,string> dic;//dictionary
    string a,b,s,tmp;
    map<string,string>::iterator it;//定义迭代器
    cin>>n;
    while(n--){
        cin>>a>>b;
        dic[a]=b;
    }
    cin>>s;
    for(int i=0;i<s.length();i++){
        if(s[i]>=97&&s[i]<=122){//是否为字母
            tmp+=s[i];//将当前字符加入tmp
        }else{//是标点符号
        //对单词进行处理
            if(!tmp.empty()){//如果tmp中有字符
                it=dic.find(tmp);//查找
                if(it==dic.end()){//无
                    cout<<"UNK";
                }else{//有
                    cout<<it->second;//map可以使用it->first来访问键,使用it->second访问值
                }
                tmp="";//清空tmp
            }
            cout<<s[i];//输出标点符号
        }

    }
    if(!tmp.empty()){//由于末尾没有标点符号,再处理一次
        it=dic.find(tmp);
        if(it==dic.end()){
            cout<<"UNK";
        }else{
            cout<<it->second;
        }
    }
    return 0;
}