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

news2024/11/27 13:00:38

在这里插入图片描述

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

def segment(sentence, dictionary):
    result = []
    length = len(sentence)
    start = 0

    while 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 = word

        if longest_word is not None:
            result.append(longest_word)
            start += len(longest_word)
        else:
            start += 1

    return result

def 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在线答疑。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2099931.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spark-Yarn模式如何配置历史服务器

在Spark程序结束之后我们也想看到运行过程怎么办&#xff1f; Yarn模式下&#xff0c;通过以下步骤配置历史服务器即可: mv spark-defaults.conf.template spark-defaults.conf修改spark-default.conf 文件&#xff0c;配置日志存储路径 spark.eventLog.enabled true spark.…

pg小版本升级

文章目录 一、升级计划二、升级步骤1、安装目标版本数据库2、停止数据库实例3、备份数据目录4、调整环境变量&#xff0c;PGHOME/LD_LIRARAY_PATH5、使用新版本启动数据库 三、检查升级后的数据库 一、升级计划 pg14.0 -> pg14.9 查看当前版本信息&#xff1a; select ve…

24 - 第三方库的使用支持

---- 整理自狄泰软件唐佐林老师课程 文章目录 1. 第三方库的使用支持1.1 问题1.2 经验假设1.3 第三方库在项目中的位置 2. 第三方库的编译阶段支持3. 第三方库的链接阶段支持4. 实验 1. 第三方库的使用支持 1.1 问题 当需要使用第三方库文件时&#xff0c;编译环境中的 makef…

vue2中用到了 vuex 实现一个 留言板效果

一.效果图展示&#xff1a; 二.静态网页&#xff08;html&#xff09;代码 <template><div><h1>班级留言板</h1><ol><li v-for"(msg, index) in classmsgs" :key"index">{{ msg }} <a href"#" click.p…

折叠屏、曲面屏始终都是少数派,凭啥挑战iPhone16?

国内手机市场是一个很特别的市场&#xff0c;眼见着在处理器性能、拍照等方面都已无法再挑战苹果&#xff0c;国产手机这几年紧紧抓住折叠屏、曲面屏等差异化技术&#xff0c;试图与苹果掰手腕&#xff0c;然而从现实来看&#xff0c;这些技术其实都已失败了。 曲面屏基本可以说…

直接计算法计算CRC-32/MPEG-2

代码&#xff1a; #include<stdio.h>#define BUFFER_SIZE 114typedef unsigned int uint32_t; typedef unsigned char uint8_t;uint8_t output[BUFFER_SIZE*4]; static const uint32_t aDataBuffer[BUFFER_SIZE] {0x00001021, 0x20423063, 0x408450a5, 0x60c670e7, …

引领八亿人的“发现感”,深度旅游时代正式到来

原文链接&#xff1a;深度旅游新纪元已降临&#xff0c;我们正带领八亿旅行者开启探索之旅&#xff0c;发现世界的无限精彩 一些人在旅行时渴望探索全新的城市&#xff0c;体验那里独特的风情&#xff1b;而另一些人则被“必住榜”上的苏州平江华府酒店吸引&#xff0c;想要亲…

计算机毕业设计Spark+PyTorch股票推荐系统 股票预测系统 股票可视化 股票数据分析 量化交易系统 股票爬虫 股票K线图 大数据毕业设计 AI

《SparkPyTorch股票推荐与预测系统》开题报告 一、研究背景与意义 随着信息技术的飞速发展和全球金融市场的日益繁荣&#xff0c;股票投资已成为广大投资者的重要选择之一。然而&#xff0c;股票市场的复杂性和不确定性使得投资者在做出投资决策时面临巨大的挑战。传统的股票…

ceph中pg与pool关系

在Ceph中&#xff0c;PG&#xff08;Placement Group&#xff09;和Pool是非常重要的概念&#xff0c;它们在Ceph的存储架构中扮演着关键角色。理解这些概念有助于更好地管理和优化Ceph集群。下面详细介绍这两个概念及其相互关系。 Pool&#xff08;存储池&#xff09; 定义&am…

牧野机床采集数据

牧野于1958年研发出日本第一数控铣床,并于1966年研发成功日本第一台加工中心。我在市面上常见的到的加工中心P5、P6系统,其余的就是EDM数控系统。他们两个用的不是同一种系统,采集方式也有区别,大家要注意。 牧野机床(中国)有限公司,于2002年7月23日在江苏昆山成立,是一…

sqli-labs靶场通关攻略(六十一关到六十五关)

sqli-labs-master靶场第六十一关 步骤一&#xff0c;判断闭合方式 ?id1)) -- 步骤二&#xff0c;查看数据库 ?id1)) and updatexml(1,concat(1,(select database())),1) -- 步骤三&#xff0c;查看表名 ?id-1)) and updatexml(1,concat(1,(select group_concat(table_na…

【K8s】专题十三:Kubernetes 容器运行时之 Docker 与 Containerd 详解

本文内容均来自个人笔记并重新梳理&#xff0c;如有错误欢迎指正&#xff01; 如果对您有帮助&#xff0c;烦请点赞、关注、转发、订阅专栏&#xff01; 专栏订阅入口 Linux 专栏 | Docker 专栏 | Kubernetes 专栏 往期精彩文章 【Docker】&#xff08;全网首发&#xff09;Kyl…

记忆化搜索【上】

509. 斐波那契数 题目链接&#xff1a;斐波那契数 递归&#xff08;暴搜&#xff09; 斐波那契数列&#xff0c;最传统的解法&#xff0c;采用递归&#xff1a; class Solution { public:int fib(int n){return dfs(n);}int dfs(int n){if(n 0 || n 1)return n;return d…

搭建核心架构网络项目(局域网)

一个基础项目的搭建 一、项目简介 这个项目主要就是最基础的一个局域网&#xff0c;模拟现实企业的网络架构&#xff0c;确保网络的安全性&#xff0c;通过VLAN划分实现不同部门或用户组的隔离等。 下图是我们这次要搭建的局域网拓扑图。&#xff08;左边为财务部门&#xff0…

[Algorithm][综合训练][kotori和n皇后][取金币][矩阵转置]详细讲解

目录 1.kotori和n皇后1.题目链接2.算法原理详解 && 代码实现 2.取金币1.题目链接2.算法原理详解 && 代码实现 3.矩阵转置1.题目链接2.算法原理详解 && 代码实现 1.kotori和n皇后 1.题目链接 kotori和n皇后 2.算法原理详解 && 代码实现 解法&…

Yapi部署文档

Yapi是高效、易用、功能强大的API管理平台&#xff0c;旨在为开发、产品、测试人员提供更优雅的接口管理服务 官网地址&#xff1a;Yapi 环境&#xff1a; l Git l NodeJs&#xff08;7.6&#xff09; l Mongodb&#xff08;2.6&#xff09; 1、 NodeJs的安装 获取资源 …

嵌入式硬件-ARM处理器架构,CPU,SOC片上系统处理器

多进程空间内部分布图&#xff1a;注意&#xff1a;创建线程实际使用兑取空间&#xff0c;栈区独立 ARM处理器架构&#xff1a; 基于ARM920T架构的CPU:以下时哈佛结构ARM920T是ARM公司的32位RISC&#xff08;精简指令集计算机&#xff09;处理器内核。它具有以下特点&#xff1…

day-47 组合

思路 回溯&#xff1a;利用个dfs方法递归调用&#xff0c;每个元素有选或不选两种抉择&#xff0c;当选中元素个数等于k时&#xff0c;将链表p加入答案&#xff0c;当idsn且选中元素个数小于n时&#xff0c;直接返回 解题过程 每次选中元素调用dfs方法后记得还原 Code class…

【数据结构】顺序表和链表——顺序表(包含丰富算法题)

文章目录 1. 线性表2. 顺序表2.1 概念与结构2.2 分类2.2.1 静态顺序表2.2.2 动态顺序表 2.3 动态顺序表的实现2.4 顺序表算法题2.4.1 移除元素2.4.2 删除有序数组中的重复项2.4.3 合并两个有序数组 2.5 顺序表问题与思考 1. 线性表 线性表&#xff08;linear list&#xff09;…

vivado 定义时间约束

定义时间约束和 例外情况 在本实验中&#xff0c;您将学习两种为设计创建约束的方法。您必须使用 AMD Vivado™IDE中包含的AMD Kintex™7 CPU网表示例设计。 第一步&#xff1a;打开示例项目 1.打开Vivado IDE。 •在Linux上&#xff1a; 1.更改实验室材料的存储目录。 cd&…