华为OD机试真题 - 中文分词模拟器(Python/JS/C/C++ 2024 D卷 100分)

2024-09-03 08:52

本文主要是介绍华为OD机试真题 - 中文分词模拟器(Python/JS/C/C++ 2024 D卷 100分),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

华为OD机试 2024E卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

给定一个连续不包含空格字符的字符串,该字符串仅包含英文小写字母及英文标点符号(逗号、句号、分号),同时给定词库,对该字符串进行精确分词。

说明:

  • 精确分词:字符串分词后,不会出现重叠。例如 “ilovechina”,不同切分后可得到 “i”, “love”, “china”。
  • 标点符号不分词,仅用于断句。
  • 词库:根据常识及词库统计出来的常用词汇。例如:dictionary={“i”,“love”,“china”,“ilovechina”,“lovechina”}。
  • 分词原则:采用分词顺序优先且最长匹配原则。“ilovechina”,假设分词结果[i,ilove,lo,love,ch,china,lovechina] 则输出 [ilove,china]
    • 错误输出:[i, lovechina],原因:“ilove” > 优先于 “lovechina” 成词。
    • 错误输出:[i, love, china],原因:“ilove” > “i”,遵循最长匹配原则。

二、输入描述

  1. 字符串长度限制:0 < length < 256
  2. 词库长度限制:0 < length < 100000
  3. 第一行输入待分词语句 “ilovechina”
  4. 第二行输入中文词库 “i, love, china, ch, na, ve, lo, this, is, the, word”

三、输出描述

按顺序输出分词结果 “i, love, china”

1、输入

ilovechina
i,love,china,ch,na,ve,lo,this,is,the,word

2、输出

i,love,china

3、说明

输入的字符串被按最长匹配原则分为 “i”, “love”, “china”。

四、测试用例

1、输入

ilovech
i,love,china,ch,na,ve,lo,this,is,the,word

2、输出

i,love,ch

3、说明

输入的字符串被按最长匹配原则分为 “i”, “love”, “ch”。

五、解题思路

  1. 解析输入:
    • 读取待分词的字符串。
    • 读取词库,并将其转换为一个集合(Set),以便于快速查找。
  2. 处理标点符号:
    • 标点符号仅用于断句,不参与分词。可以使用正则表达式将字符串按标点符号分割。
  3. 分词处理:
    • 对每个子字符串进行分词,遵循最长匹配原则。
    • 从字符串的第一个字符开始,尝试匹配最长的单词,如果匹配成功,将该单词加入结果集,继续处理剩下的部分。
  4. 输出结果:
    • 将所有子字符串的分词结果组合起来,并按要求格式输出。

六、Python算法源码

import redef segment(sentence, dictionary):result = []length = len(sentence)start = 0while start < length:longest_word = None# 从当前起始位置向后查找for end in range(start + 1, length + 1):word = sentence[start:end]if word in dictionary:if longest_word is None or len(word) > len(longest_word):longest_word = wordif longest_word is not None:result.append(longest_word)start += len(longest_word)else:start += 1return resultdef main():# 读取待分词语句input_string = input("请输入待分词语句:")# 读取词库dictionary_input = input("请输入词库:")# 将词库字符串解析成集合,方便后续查找dictionary = set(dictionary_input.split(","))# 使用正则表达式按标点符号将输入字符串分割成多个子字符串sentences = re.split(r'[,.]', input_string)# 存储分词结果result = []# 对每个子字符串进行分词处理for sentence in sentences:result.extend(segment(sentence.strip(), dictionary))# 按要求格式输出分词结果print(", ".join(result))if __name__ == "__main__":main()

七、JavaScript算法源码

function segment(sentence, dictionary) {const result = [];const length = sentence.length;let start = 0;while (start < length) {let longestWord = null;// 从当前起始位置向后查找for (let end = start + 1; end <= length; end++) {const word = sentence.substring(start, end);if (dictionary.has(word)) {if (longestWord === null || word.length > longestWord.length) {longestWord = word;}}}if (longestWord !== null) {result.push(longestWord);start += longestWord.length;} else {start += 1;}}return result;
}function main() {// 读取待分词语句const input = prompt("请输入待分词语句:");// 读取词库const dictionaryInput = prompt("请输入词库:");// 将词库字符串解析成集合,方便后续查找const dictionary = new Set(dictionaryInput.split(","));// 使用正则表达式按标点符号将输入字符串分割成多个子字符串const sentences = input.split(/[,.;]/);// 存储分词结果const result = [];// 对每个子字符串进行分词处理for (const sentence of sentences) {result.push(...segment(sentence.trim(), dictionary));}// 按要求格式输出分词结果console.log(result.join(", "));
}// 调用主函数
main();

八、C算法源码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>#define MAX_WORD_LENGTH 100
#define MAX_SENTENCE_LENGTH 1000
#define MAX_DICTIONARY_SIZE 100// 字符串切割函数,类似于Python的split()
char** split(const char* str, const char* delim, int* count) {char* str_copy = strdup(str); // 复制字符串,以免修改原字符串char* token = strtok(str_copy, delim);char** result = malloc(MAX_SENTENCE_LENGTH * sizeof(char*));*count = 0;while (token != NULL) {result[(*count)++] = strdup(token);token = strtok(NULL, delim);}free(str_copy);return result;
}// 判断词库中是否包含某个单词
int is_in_dictionary(char* word, char dictionary[MAX_DICTIONARY_SIZE][MAX_WORD_LENGTH], int dict_size) {for (int i = 0; i < dict_size; i++) {if (strcmp(word, dictionary[i]) == 0) {return 1;}}return 0;
}// 分词函数,遵循最长匹配原则
void segment(char* sentence, char dictionary[MAX_DICTIONARY_SIZE][MAX_WORD_LENGTH], int dict_size, char result[MAX_SENTENCE_LENGTH][MAX_WORD_LENGTH], int* result_count) {int length = strlen(sentence);int start = 0;*result_count = 0;while (start < length) {char longest_word[MAX_WORD_LENGTH] = "";int longest_length = 0;for (int end = start + 1; end <= length; end++) {char word[MAX_WORD_LENGTH];strncpy(word, sentence + start, end - start);word[end - start] = '\0';if (is_in_dictionary(word, dictionary, dict_size) && strlen(word) > longest_length) {strcpy(longest_word, word);longest_length = strlen(word);}}if (longest_length > 0) {strcpy(result[*result_count], longest_word);(*result_count)++;start += longest_length;} else {start++;}}
}int main() {char input[MAX_SENTENCE_LENGTH];char dictionary_input[MAX_SENTENCE_LENGTH];char dictionary[MAX_DICTIONARY_SIZE][MAX_WORD_LENGTH];int dict_size = 0;// 读取待分词语句printf("请输入待分词语句:\n");fgets(input, MAX_SENTENCE_LENGTH, stdin);input[strcspn(input, "\n")] = '\0';  // 去除换行符// 读取词库printf("请输入词库:\n");fgets(dictionary_input, MAX_SENTENCE_LENGTH, stdin);dictionary_input[strcspn(dictionary_input, "\n")] = '\0';  // 去除换行符// 将词库字符串解析成二维数组int word_count;char** words = split(dictionary_input, ",", &word_count);for (int i = 0; i < word_count; i++) {strcpy(dictionary[dict_size++], words[i]);free(words[i]);}free(words);// 使用标点符号将输入字符串分割成多个子字符串int sentence_count;char** sentences = split(input, ",.;", &sentence_count);// 存储分词结果char result[MAX_SENTENCE_LENGTH][MAX_WORD_LENGTH];int result_count;// 对每个子字符串进行分词处理for (int i = 0; i < sentence_count; i++) {segment(sentences[i], dictionary, dict_size, result, &result_count);for (int j = 0; j < result_count; j++) {if (i > 0 || j > 0) {printf(", ");}printf("%s", result[j]);}free(sentences[i]);}free(sentences);printf("\n");return 0;
}

九、C++算法源码

#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <cstring>
#include <algorithm>using namespace std;// 字符串分割函数,类似于Python的split()
vector<string> split(const string &str, const string &delim) {vector<string> tokens;size_t prev = 0, pos = 0;do {pos = str.find_first_of(delim, prev);if (pos == string::npos) pos = str.length();string token = str.substr(prev, pos - prev);if (!token.empty()) tokens.push_back(token);prev = pos + 1;} while (pos < str.length() && prev < str.length());return tokens;
}// 判断词库中是否包含某个单词
bool is_in_dictionary(const string &word, const vector<string> &dictionary) {return find(dictionary.begin(), dictionary.end(), word) != dictionary.end();
}// 分词函数,遵循最长匹配原则
vector<string> segment(const string &sentence, const vector<string> &dictionary) {vector<string> result;size_t length = sentence.length();size_t start = 0;while (start < length) {string longest_word;size_t longest_length = 0;for (size_t end = start + 1; end <= length; ++end) {string word = sentence.substr(start, end - start);if (is_in_dictionary(word, dictionary) && word.length() > longest_length) {longest_word = word;longest_length = word.length();}}if (!longest_word.empty()) {result.push_back(longest_word);start += longest_length;} else {start++;}}return result;
}int main() {string input;string dictionary_input;// 读取待分词语句cout << "请输入待分词语句:" << endl;getline(cin, input);// 读取词库cout << "请输入词库:" << endl;getline(cin, dictionary_input);// 将词库字符串解析成集合,方便后续查找vector<string> dictionary = split(dictionary_input, ",");// 使用标点符号将输入字符串分割成多个子字符串vector<string> sentences = split(input, ",.;");// 存储分词结果vector<string> result;// 对每个子字符串进行分词处理for (const string &sentence : sentences) {vector<string> segmented = segment(sentence, dictionary);result.insert(result.end(), segmented.begin(), segmented.end());}// 按要求格式输出分词结果for (size_t i = 0; i < result.size(); ++i) {if (i > 0) {cout << ", ";}cout << result[i];}cout << endl;return 0;
}

🏆下一篇:华为OD机试真题 - 简易内存池(Python/JS/C/C++ 2024 E卷 200分)

🏆本文收录于,华为OD机试真题(Python/JS/C/C++)

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

这篇关于华为OD机试真题 - 中文分词模拟器(Python/JS/C/C++ 2024 D卷 100分)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1132560

相关文章

JS常用组件收集

收集了一些平时遇到的前端比较优秀的组件,方便以后开发的时候查找!!! 函数工具: Lodash 页面固定: stickUp、jQuery.Pin 轮播: unslider、swiper 开关: switch 复选框: icheck 气泡: grumble 隐藏元素: Headroom

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题是由安全生产模拟考试一点通提供,流动式起重机司机证模拟考试题库是根据流动式起重机司机最新版教材,流动式起重机司机大纲整理而成(含2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题参考答案和部分工种参考解析),掌握本资料和学校方法,考试容易。流动式起重机司机考试技

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

高效录音转文字:2024年四大工具精选!

在快节奏的工作生活中,能够快速将录音转换成文字是一项非常实用的能力。特别是在需要记录会议纪要、讲座内容或者是采访素材的时候,一款优秀的在线录音转文字工具能派上大用场。以下推荐几个好用的录音转文字工具! 365在线转文字 直达链接:https://www.pdf365.cn/ 365在线转文字是一款提供在线录音转文字服务的工具,它以其高效、便捷的特点受到用户的青睐。用户无需下载安装任何软件,只