华为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

相关文章

Python中你不知道的gzip高级用法分享

《Python中你不知道的gzip高级用法分享》在当今大数据时代,数据存储和传输成本已成为每个开发者必须考虑的问题,Python内置的gzip模块提供了一种简单高效的解决方案,下面小编就来和大家详细讲... 目录前言:为什么数据压缩如此重要1. gzip 模块基础介绍2. 基本压缩与解压缩操作2.1 压缩文

Python设置Cookie永不超时的详细指南

《Python设置Cookie永不超时的详细指南》Cookie是一种存储在用户浏览器中的小型数据片段,用于记录用户的登录状态、偏好设置等信息,下面小编就来和大家详细讲讲Python如何设置Cookie... 目录一、Cookie的作用与重要性二、Cookie过期的原因三、实现Cookie永不超时的方法(一)

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

Python函数作用域示例详解

《Python函数作用域示例详解》本文介绍了Python中的LEGB作用域规则,详细解析了变量查找的四个层级,通过具体代码示例,展示了各层级的变量访问规则和特性,对python函数作用域相关知识感兴趣... 目录一、LEGB 规则二、作用域实例2.1 局部作用域(Local)2.2 闭包作用域(Enclos

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四

Python中win32包的安装及常见用途介绍

《Python中win32包的安装及常见用途介绍》在Windows环境下,PythonWin32模块通常随Python安装包一起安装,:本文主要介绍Python中win32包的安装及常见用途的相关... 目录前言主要组件安装方法常见用途1. 操作Windows注册表2. 操作Windows服务3. 窗口操作

Python中re模块结合正则表达式的实际应用案例

《Python中re模块结合正则表达式的实际应用案例》Python中的re模块是用于处理正则表达式的强大工具,正则表达式是一种用来匹配字符串的模式,它可以在文本中搜索和匹配特定的字符串模式,这篇文章主... 目录前言re模块常用函数一、查看文本中是否包含 A 或 B 字符串二、替换多个关键词为统一格式三、提

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat