华为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使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

定价129元!支持双频 Wi-Fi 5的华为AX1路由器发布

《定价129元!支持双频Wi-Fi5的华为AX1路由器发布》华为上周推出了其最新的入门级Wi-Fi5路由器——华为路由AX1,建议零售价129元,这款路由器配置如何?详细请看下文介... 华为 Wi-Fi 5 路由 AX1 已正式开售,新品支持双频 1200 兆、配有四个千兆网口、提供可视化智能诊断功能,建

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2

Python Jupyter Notebook导包报错问题及解决

《PythonJupyterNotebook导包报错问题及解决》在conda环境中安装包后,JupyterNotebook导入时出现ImportError,可能是由于包版本不对应或版本太高,解决方... 目录问题解决方法重新安装Jupyter NoteBook 更改Kernel总结问题在conda上安装了

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相