《小杨的字典》题解

马上考四级了,不刷刷题怎么能行呢?HELLO,大家好,我是Zac,今天我来给大家分享一道题:小杨的字典 ->   here

题目描述

在遥远的星球,有两个国家 A 国和 B 国,他们使用着不同的语言:A 语言和 B 语言。小杨是 B 国的翻译官,他的工作是将 A 语言的文章翻译成 B 语言的文章。

为了顺利完成工作,小杨制作了一本字典,里面记录了 N 个 A 语言单词对应的 B 语言单词,巧合的是,这些单词都 由地球上的 26 个小写英文字母组成。

小杨希望你写一个程序,帮助他根据这本字典翻译一段 A 语言文章。这段文章由标点符号 !()-.[].{}\|;:'",./?<> 和一些 A 语言单词构成,每个单词之间必定由至少一个标点符号分割,你的程序需要把这段话中的所有 A 语言单词替换成它的 B 语言翻译。特别地,如果遇到不在字典中的单词,请使用大写 UNK 来替换它。

例如,小杨的字典中包含 2 个 A 语言单词 abc 和 d,它们的 B 语言翻译分别为 a 和 def,那么我们可以把 A 语言文章 abc.d.d.abc.abcd. 翻译成 B 语言文章 a.def.def.a.UNK. 其中,单词 abcd 不在词典内,因此我们需要使用 UNK 来替换它。

输入格式

第一行一个整数 N,表示词典中的条目数。保证 N≤100。

接下来 N 行,每行两个用单个空格隔开的字符串 A, B ,分别表示字典中的一个 A 语言单词以及它对应的 B 语言翻译。保证所有 A 不重复;保证 A 和 B 的长度不超过 10。

最后一行一个字符串 S ,表示需要翻译的 A 语言文章。保证字符串 S 的长度不超过 1000,保证字符串 S 只包含小写字母以及标点符号 !()-.[].{}\|;:'",./?<> 。

输出格式

输出一行,表示翻译后的结果。

输入输出样例

(这里只给两组哈)

输入 #1

2
abc a
d def
abc.d.d.abc.abcd

输出 #1

a.def.def.a.UNK

—————————————————————————————————————————— 

输入 #2

1
abcdefghij klmnopqrst
!()-[]{}\|;:'",./?<>abcdefghijklmnopqrstuvwxyz

输出 #2

!()-[]{}\|;:'",./?<>UNK

题目分析

为了解决这个问题,我们可以按照以下步骤编写代码:

  1. 读取输入的字典条目数 n

  2. 创建一个字典(在编程语言中通常称为哈希表或映射)来存储 A 语言单词到 B 语言翻译的映射。

  3. 读取字典中的每个条目,将 A 语言单词和对应的 B 语言翻译存入字典。

  4. 读取需要翻译的文章字符串 ar

  5. 遍历文章字符串,使用正则表达式或字符串分割的方法来识别 A 语言单词。

  6. 对于每个识别出的 A 语言单词,检查它是否在字典中:

    • 如果在字典中,用对应的 B 语言翻译替换它。

    • 如果不在字典中,用 "UNK" 替换。

  7. 输出翻译后的文章。

AC代码:

话不多说上代码吧:(英文注释希望大家能看懂…… :))

强迫症版:

#include <iostream>
#include <string>
using namespace std;
string a[105]; // the language in A country
string b[105]; // translate into B country's language
int main() {
    int n;
    cin >> n;
    for (int i = 0; i < n; ++i) {
        string a1, b1; // language
        cin >> a1 >> b1;
        a[i] = a1;
        b[i] = b1;
    }
    string ar; // the article
    cin >> ar;
    string word = ""; // use it to store words in order to translate
    for (int i = 0; i < ar.size(); i++) {
        if (ar[i] >= 'a' && ar[i] <= 'z') {
            word += ar[i];
        }
        if (((i == ar.size() - 1) && (ar[i] >= 'a' && ar[i] <= 'z')) || !(ar[i] >= 'a' && ar[i] <= 'z')) { // what the ...?
            if (word != "") {
                bool flag = 0; // use it to decide if a word is in the dictionary
                for (int j = 0; j < n; j++) {
                    if (word == a[j]) {
                        cout << b[j];
                        flag = 1; // it is founded
                    }
                }
                if (flag == 0) { // if it is not a word in the dictionary, than print "UNK"
                    cout << "UNK";
                }
                word = "";
            }
        }
        if (!(ar[i] >= 'a' && ar[i] <= 'z')) { // if it is not a letter in a word, than print it
            cout << ar[i];
        }
    }
    return 0; // don't miss it! :)
}

 懒人版:

#include<iostream>
#include<string>
using namespace std;
string a[105]; // the language in A country
string b[105]; // translate into B country's language
int main(){
    int n;
    cin>>n;
    for(int i=0;i<n;++i){
        string a1,b1; // language
        cin>>a1>>b1;
        a[i]=a1;
        b[i]=b1;
    }
    string ar;//the article
    cin>>ar;
    string word="";//use it to store words in order to translate
    for(int i=0;i<ar.size();i++){
        if(ar[i]>='a'&&ar[i]<='z'){
            word+=ar[i];
        }
        if((i==ar.size()-1&&ar[i]>='a'&&ar[i]<='z')||(!(ar[i]>='a'&&ar[i]<='z'))){ // what the ...?
            if(word!=""){
            bool flag=0; // use it to decide if a word is in the dictionary
            for(int j=0;j<n;j++){
                if(word==a[j]){
                    cout<<b[j];
                    flag=1; // it is founded
                }
            }
            if(flag==0){ // if it is not a word in the dictionary,than print "UNK"
                cout<<"UNK";
            }
            word="";
            }
        }
        if(!(ar[i]>='a'&&ar[i]<='z')){ // if it is not a letter in a word,than print it
            cout<<ar[i];
        }
    }
    return 0; // don't miss it! :)
}

代码分析:

这段C++代码实现了一个简单的翻译程序,用于将一段由特定单词组成的文本从一种语言(A语言)翻译到另一种语言(B语言)。程序的主要步骤如下:

  1. 初始化和输入字典

    • 首先,程序通过输入整数 n 来确定字典中有多少个单词对。

    • 然后,程序循环 n 次,每次循环中读取一个A语言单词和一个对应的B语言翻译,将它们分别存储在数组 a 和 b 中。

  2. 读取待翻译文本

    • 程序读取一个字符串 ar,这个字符串包含了需要翻译的文本。

  3. 翻译过程

    • 程序遍历字符串 ar 的每个字符。

    • 如果字符是字母(即在 'a' 到 'z' 范围内),它会被添加到一个临时字符串 word 中,这个字符串用于构建当前正在处理的单词。

    • 当遇到非字母字符或到达字符串的末尾时,程序检查 word 是否非空:

      • 如果 word 非空,程序遍历字典(数组 a 和 b),寻找 word 是否在字典中:

        • 如果找到,输出对应的B语言翻译(从数组 b 中获取)。

        • 如果没找到,输出 "UNK" 表示单词未在字典中找到。

        • 然后清空 word 以准备下一个单词的构建。

    • 如果当前字符是非字母字符,并且 word 非空,程序会先处理 word(如上所述),然后输出当前的非字母字符。

  4. 输出结果

    • 程序最终输出翻译后的文本,其中所有在字典中的单词都被替换为相应的B语言翻译,不在字典中的单词被替换为 "UNK"。

这个程序处理了文本中的单词和标点符号,能够根据提供的字典进行翻译,并且能够正确地处理文本末尾的单词。

致谢

感谢kimi小助手帮我进行了懒人版的转换,是它的智能给予我了效率,让我能顺利发表这篇文章。

也感谢所有支持我的人,是你们的鼓励与支持推动我前进,让我有了更多的动力,谢谢!

(END……对了,话说一键三连不过分吧?毕竟我可是写了3426个字呢👍🏼📂✅🙏🏼)

  • 28
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值