当前位置:首页 > GESP > 洛谷B3927题:基于哈希表实现文章翻译

洛谷B3927题:基于哈希表实现文章翻译

4个月前 (08-13)

洛谷B3927题:基于哈希表实现文章翻译 GESP 哈希表 字典序 C++ GESP四级 第1张

一、题目解读

洛谷B3927题要求实现一个简单的翻译系统:给定A语言到B语言的字典映射,以及一篇A语言文章,需要将文章中的每个单词替换为字典中对应的B语言单词。若字典中不存在该单词,则用"UNK"代替。题目核心在于高效处理字符串分单词、字典查询及标点符号的保留。

二、解题思路

1. 哈希表映射:使用unordered_map<string, string> dictionary存储A语言到B语言的单词映射,支持O(1)查询效率。

2. 分单词处理:遍历文章字符流,利用标点符号作为分隔符,将连续的非标点字符组成单词,再进行字典查找。

3. 未知词处理:若单词未在字典中,统一输出"UNK"保证翻译完整性。

4. 标点保留:遇到标点符号时直接添加到结果串,确保翻译后文章格式不变。

三、解题步骤

1. 输入参数:读取字典条目数N,循环N次输入A语言单词a和B语言翻译b,存入字典。

2. 处理文章:逐字符遍历输入的文章,根据是否标点符号执行不同逻辑。

3. 单词积累:非标点字符时,拼接至currentWord;遇标点或文章末尾时,查询字典并输出结果。

4. 结果输出:最终拼接完成的翻译结果打印。

四、代码与注释

#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;

// 判断字符是否为标点符号
bool isPunctuation(char c) {
    return c < 'a' || c > 'z'; // 仅考虑小写字母外的字符为标点
}

int main() {
    long long N;
    cin >> N; // 输入字典条目数
    
    // 创建字典,存储A语言到B语言的映射
    unordered_map<string, string> dictionary;
    
    // 读取字典条目
    for (int i = 0; i < N; i++) {
        string a, b;
        cin >> a >> b; // 输入A单词和对应B翻译
        dictionary[a] = b; // 存入哈希表
    }
    
    string article, result; // 原文章和翻译结果
    cin >> article; // 输入待翻译文章
    
    string currentWord; // 当前正在处理的单词
    for (char c : article) {
        if (isPunctuation(c)) {
            // 遇到标点符号,处理当前单词
            if (!currentWord.empty()) {
                // 查找字典
                if (dictionary.count(currentWord)) {
                    result += dictionary[currentWord];
                } else {
                    result += "UNK"; // 未知单词替换
                }
                currentWord.clear(); // 清空当前单词
            }
            result += c; // 添加标点符号至结果
        } else {
            // 非标点符号,添加到当前单词
            currentWord += c;
        }
    }
    
    // 处理文章末尾可能剩余的单词
    if (!currentWord.empty()) {
        if (dictionary.count(currentWord)) {
            result += dictionary[currentWord];
        } else {
            result += "UNK";
        }
    }
    
    cout << result << endl; // 输出翻译结果
    return 0;
}

五、总结

该解法通过哈希表优化了字典查询效率,结合字符流分单词处理,实现了简洁且高效的翻译逻辑。关键点在于利用标点符号作为自然分隔符,避免了复杂的分词算法。对于大规模文本翻译,可进一步优化哈希表内存管理或采用更高效的数据结构




原创内容 转载请注明出处

分享给朋友:

相关文章

IOI 1994 洛谷1216:如何用O(1)空间解决数字三角形问题?附代码实现

IOI 1994 洛谷1216:如何用O(1)空间解决数字三角形问题?附代码实现

题目重解:数字三角形是一个经典的动态规划问题,给定一个由数字组成的三角形结构,从顶部出发,每次可以移动到下方相邻的数字,最终到达底部。我们需要找到一条路径,使得路径上经过的数字总和最大。这个问题可以很...

2024年GESP四级宝箱题(洛谷P4006)题解:滑动窗口算法优化最长子序列和

2024年GESP四级宝箱题(洛谷P4006)题解:滑动窗口算法优化最长子序列和

一、题目解读本题为2024年GESP四级中的“宝箱”问题(对应洛谷P4006),要求在一个由n个宝箱组成的序列中,找出一个连续子序列,使得该子序列中宝箱价值之和最大,且子序列中最大值与最小值的差不超过...

力扣3112题解法:带时间限制的最短路径问题解析(C++代码)

力扣3112题解法:带时间限制的最短路径问题解析(C++代码)

一、题目解读力扣3112题要求解决带时间限制的最短路径问题:给定一个有向图,节点具有消失时间,需计算从起点到各节点的最短路径,且路径总时间不能超过节点的消失时间。题目难点在于需在传统最短路径算法(如D...

洛谷1220题解:动态规划与区间DP优化解法(附代码注释)

洛谷1220题解:动态规划与区间DP优化解法(附代码注释)

一、题目解读洛谷1220题要求计算在n个位置放置灯的情况下,通过关闭连续区间灯并移动至区间端点,使得总耗电量最小。需考虑灯的功率与位置差异,设计高效的算法求解最优策略。二、解题思路1. 动态规划 +...

牛客NC67题解:汉诺塔递归算法与解题步骤

牛客NC67题解:汉诺塔递归算法与解题步骤

一、题目解读牛客NC67题要求解决汉诺塔问题,这是一个经典的递归算法题目。题目给定整数n,代表汉诺塔中的盘子数量,需要输出将n个盘子从起始柱移动到目标柱的所有步骤。汉诺塔问题规则为:每次只能移动一个盘...

2023年GESP四级田忌赛马算法解析(洛谷B3928)— C++双指针策略与代码详解

2023年GESP四级田忌赛马算法解析(洛谷B3928)— C++双指针策略与代码详解

一、题目解读“田忌赛马”源自中国古代典故,田忌通过策略性安排马匹对阵顺序,以弱马对阵强马、强马对阵弱马的方式,实现整体胜利。在算法竞赛中,该问题通常转化为:给定两方马匹的战斗力数组,如何通过对阵策略最...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。