2024华为OD机试真题---中文分词模拟器

news2024/11/13 17:51:00

华为OD机试中的中文分词模拟器题目,通常要求考生对给定的不包含空格的字符串进行精确分词。这个字符串仅包含英文小写字母及英文标点符号(如逗号、分号、句号等),同时会提供一个词库作为分词依据。以下是对这类题目的详细解析

一、题目描述

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

说明:
1、精确分词:字符串分词后,不会出现重复。即"ilovechina",不同词库可分割为"i,love,china",“ilove,china”,不能分割出现重的"i,ilove,china",i出现重复。

2、标点符号不成词,仅用于断句。

3、词库:根据外部知识库统计出来的常用词汇例:

dictionary=["i","ove","china","lovechina","ilove"]

4、分词原则:采用分词顺序优先且最长匹配原则

  • “ilovechina”,假设分词结果 [i,ilove,lo,love,ch,china,lovechina],则输出 [ilove,china]
  • 错误输出:[i,lovechina],原因:“ilove”>优先于"lovechina" 成词
  • 错误输出:[i,love,china],原因:“ilove”>"i"遵循最长匹配原则

二、输入描述

第一行输入待分词语句"ilovechina"
字符串长度限制:0<length<256

第二行输入中文词库

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

词库长度限制:1<length<100000

三、输出描述

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

用例1

输入

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

输出

i,love,china

说明

用例2

输入

iat
i,love,china,ch,na,ve,lo,this,is,the,word,beauti,tiful,ful

输出

i a,t

四、分词原则

  • 精确分词:字符串分词后,不会出现重叠的情况。
  • 分词顺序:按照字符串从左到右的顺序进行分词。
  • 最长匹配:在分词时,优先匹配词库中最长的符合条件的词汇。
  • 标点符号:标点符号不成词,仅用于断句。

五、代码实现



import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Scanner;
import java.util.Set;

public class PreciseSegmentation {

    public static void main(String[] args) {
        // 使用Scanner读取输入
        Scanner scanner = new Scanner(System.in);
        // 读取待分词的句子
        String Q = scanner.nextLine();
        // 读取词库字符串
        String dictionaryStr = scanner.nextLine();
    
        // 将词库转换为集合
        Set<String> dictionary = new HashSet<>(Arrays.asList(dictionaryStr.split(",")));
    
        // 分词结果
        List<String> result = new ArrayList<>();
    
        // 当前处理的起始位置
        int start = 0;
    
        // 开始分词处理
        while (start < Q.length()) {
            // 初始化结束位置
            int end = start + 1;
            // 用于存储最长匹配的词
            String longestMatch = null;
    
            // 寻找最长匹配的词
            while (end <= Q.length()) {
                // 获取子字符串
                String sub = Q.substring(start, end);
                // 检查子字符串是否在词库中
                if (dictionary.contains(sub)) {
                    // 更新最长匹配的词
                    if (longestMatch == null || sub.length() > longestMatch.length()) {
                        longestMatch = sub;
                    }
                }
                // 移动结束位置
                end++;
            }
    
            // 如果找到匹配的词,将其加入结果列表
            if (longestMatch != null) {
                result.add(longestMatch);
                // 更新起始位置
                start += longestMatch.length();
            } else {
                // 如果没有找到匹配的词,将单个字符加入结果列表
                result.add(Q.substring(start, start + 1));
                // 移动起始位置
                start++;
            }
        }
    
        // 输出结果
        System.out.println(String.join(",", result));
    }
}


六、解题思路

解题思路如下:

  1. 输入读取

    • 使用Scanner类从标准输入读取两行数据。第一行是待分词的句子Q,第二行是词库字符串dictionaryStr
  2. 词库转换

    • 将词库字符串dictionaryStr按逗号分隔,转换为String类型的列表。
    • 使用HashSet来存储词库中的词汇,以便进行快速的查找操作。这是因为HashSet的查找时间复杂度为O(1),而列表的查找时间复杂度为O(n)。
  3. 分词处理

    • 初始化一个空列表result来存储分词结果。
    • 初始化一个变量start来记录当前处理的起始位置,初始值为0。
    • 使用一个外层while循环来遍历整个待分词的句子Q,直到start变量的值等于句子的长度。
  4. 最长匹配查找

    • 在外层循环内部,初始化一个变量end来表示当前查找的结束位置,初始值为start + 1
    • 初始化一个变量longestMatch来存储当前找到的最长匹配的词汇,初始值为null
    • 使用一个内层while循环来查找从startend之间的所有可能的子字符串,并检查它们是否在词库中。
    • 如果找到一个匹配的词汇,并且它的长度大于当前longestMatch的长度(或者longestMatchnull),则更新longestMatch的值。
    • 每次内层循环结束时,end的值都会增加1,以继续查找下一个可能的子字符串。
  5. 结果处理

    • 当内层循环结束后,检查longestMatch是否为null
    • 如果longestMatch不为null,说明找到了一个匹配的词汇,将其添加到result列表中,并更新start的值为start + longestMatch.length(),以便继续处理下一个词汇。
    • 如果longestMatchnull,说明在当前位置没有找到匹配的词汇,此时将当前位置的单个字符作为一个词汇添加到result列表中,并将start的值增加1。
  6. 输出结果

    • 使用String.join(",", result)result列表中的词汇用逗号连接起来,形成一个字符串。
    • 输出该字符串作为分词结果。

这个解题思路遵循了最长匹配原则和分词顺序优先的原则,确保了分词结果的准确性和合理性。同时,通过使用HashSet来存储词库中的词汇,提高了查找效率。

七、运行示例解析

运行示例解析如下:

输入

  1. 待分词的句子:ilovechina
  2. 词库字符串:i,love,china,ch,na,ve,lo,this,is,the,word

步骤解析

  1. 初始化

    • Q = "ilovechina"
    • 词库字符串被分割并存储在HashSet中,即dictionary = {i, love, china, ch, na, ve, lo, this, is, the, word}
    • result = [](空列表,用于存储分词结果)
    • start = 0(当前处理的起始位置)
  2. 分词处理

    • 外层while循环开始,条件是start < Q.length(),即start < 9

    第一次外层循环

    • end = start + 1 = 1
    • 内层while循环开始,条件是end <= Q.length(),即1 <= 9
      • sub = Q.substring(0, 1) = "i"dictionary.contains("i")返回true
      • 更新longestMatch = "i"
      • end递增为2。
      • sub = Q.substring(0, 2) = "il"dictionary.contains("il")返回false
      • end递增为3。
      • sub = Q.substring(0, 3) = "ilo"dictionary.contains("ilo")返回false
      • end递增为4。
      • sub = Q.substring(0, 4) = "ilov"dictionary.contains("ilov")返回false
      • end递增为5。
      • sub = Q.substring(0, 5) = "ilove"dictionary.contains("ilove")返回false
      • end递增为6。
      • sub = Q.substring(0, 6) = "ilovec"dictionary.contains("ilovec")返回false
      • end递增为7。
      • sub = Q.substring(0, 7) = "ilovech"dictionary.contains("ilovech")返回false
      • end递增为8。
      • sub = Q.substring(0, 8) = "ilovechi"dictionary.contains("ilovechi")返回false
      • end递增为9。
      • sub = Q.substring(0, 9) = "ilovechina"dictionary.contains("ilovechina")返回false(虽然这不是词库中的词,但因为我们是从头开始找,所以会继续尝试更短的词)。
      • 内层循环结束,因为end已经超过Q.length()
    • longestMatch = "i",将其加入result,即result = ["i"]
    • 更新start = 1

    后续的外层循环(类似地处理):

    • start = 1时,找到longestMatch = "love",加入result,即result = ["i", "love"]
    • start = 6时,找到longestMatch = "china",加入result,即result = ["i", "love", "china"]
    • 此时start = 11,已经超过Q.length(),外层循环结束。
  3. 输出结果

    • 使用String.join(",", result)result列表中的词汇用逗号连接起来,得到"i,love,china"
    • 输出该字符串。

最终输出

i,love,china

注意:在这个例子中,尽管词库中有一些无关的词(如ch, na, ve, lo等),但它们并没有影响分词的结果,因为分词算法总是尝试找到最长的匹配词。

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

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

相关文章

检测敏感词功能

今天策划给我一个任务 —— 检测昵称中是否含有敏感词功能&#xff0c;然后丢给我两个压缩包&#xff0c;我解压一看&#xff1a; 有的txt文件是一行一个词&#xff1a; 有的txt文件是按逗号分隔开&#xff1a; 不管是什么格式的总之量非常多&#xff0c;把我这辈子脏话都囊括…

【OpenGL】OpenGL简介

文章目录 OpenGL概述OpenGL的本质OpenGL相关库核心库窗口管理glutfreeglutglfw 函数加载glewGLAD OpenGL概述 OpenGL(Open Graphics Library) 严格来说&#xff0c;本身并不是一个API&#xff0c;它是一个由Khronos组织制定并维护的规范(Specification)。OpenGL规范严格规定了…

python-24-一篇文章彻底掌握Python HTTP库Requests

python-24-一篇文章彻底掌握Python HTTP库Requests 一.简介 在 Python 中&#xff0c;Requests 是一个非常流行且易于使用的 Python HTTP 库&#xff0c;专门用于发送 HTTP/HTTPS 请求&#xff0c;获取请求响应&#xff1b; 可能觉得HTTP请求不是应该前端去做么&#xff1f;…

SpringMVC案例学习(一)--计算器设计登录页面设计

文章目录 1.计算器1.1.html代码1.2接口设计1.3前端测试1.4接口测试 2.登录页面设计2.1接口实现2.2查看前端页面效果2.3未进行前后端交互时候的代码2.4前后端交互设计2.5个人实践遇到的问题 3.lombok介绍3.1插件安装3.2导入依赖 1.计算器 1.1.html代码 下面的这个就是我们的前…

【Linux 麒麟系统 qt 程序通过root启动 桌面程序】

通过.desktop pkexec 启动程序 关键字方案一方案二第一步 修改.desktop第二步 xxx.sh实现 注意 关键字 pkexec .desktop qt 原始需求&#xff1a; 用户在麒麟系统上通过快捷方式(.desktop)启动程序后绑定系统的26端口&#xff0c;但是因为系统权限问题&#xff0c;26端口普通…

DevOps-Gitlab-私有代码仓库

1. 概述 1. 私有代码仓库 2. 精细化权限配置,让系统更安全 3. 控制用户/用户组是否可以提交到主分支 (PR Push Request) 4. 它使用Ruby语言写成。后来&#xff0c;一些部分用Go语言重写 2. Gitlab vs Github/Gitee GitlabGithub/Gitee共同点存放代码,git访问存放代码,git访问…

【AI声音克隆整合包及教程】第二代GPT-SoVITS V2:技术、应用与伦理思考

一、引言 在当今科技迅速发展的时代&#xff0c;声音克隆技术成为人工智能领域的一个备受瞩目的分支。GPT-SoVITS V2作为一种声音克隆工具&#xff0c;正逐渐进入人们的视野&#xff0c;它在多个领域展现出巨大的潜力&#xff0c;同时也引发了一系列值得深入探讨的问题。本文旨…

重新认识HTTPS

一. 什么是 HTTPS HTTP 由于是明文传输&#xff0c;所谓的明文&#xff0c;就是说客户端与服务端通信的信息都是肉眼可见的&#xff0c;随意使用一个抓包工具都可以截获通信的内容。 所以安全上存在以下三个风险&#xff1a; 窃听风险&#xff0c;比如通信链路上可以获取通信…

Vite初始化Vue3+Typescrpt项目

初始化项目 安装 Vite 首先&#xff0c;确保你的 Node.js 版本 > 12.0.0。然后在命令行中运行以下命令来创建一个 Vite Vue 3 TypeScript 的项目模板&#xff1a; npm init vitelatest进入项目目录 创建完成后&#xff0c;进入项目目录&#xff1a; cd vue3-demo启动…

Three.js 搭建3D隧道监测

Three.js 搭建3D隧道监测 Three.js 基础元素场景scene相机carema网络模型Mesh光源light渲染器renderer控制器controls 实现3d隧道监测基础实现道路实现隧道实现多个摄像头点击模型进行属性操作实现点击模型发光效果 性能监视器stats引入使用 总结完整代码 我们将通过three.js技…

【学术会议介绍,SPIE 出版】第四届计算机图形学、人工智能与数据处理国际学术会议 (ICCAID 2024,12月13-15日)

第四届计算机图形学、人工智能与数据处理国际学术会议 2024 4th International Conference on Computer Graphics, Artificial Intelligence and Data Processing (ICCAID 2024) 重要信息 大会官网&#xff1a;www.iccaid.net 大会时间&#xff1a;2024年12月13-15日 大会地…

VScode C++配置opencv4.5.3——先赞后看,配置成功实属不易-(镜像加速环境w版和配置文件版)

前置准备&#xff1a;配置MinGW和CMake 手把手教——class1_VScode配置C环境_linux vscode cpp配置-CSDN博客文章浏览阅读398次&#xff0c;点赞4次&#xff0c;收藏6次。点击Windows x64 Installer:下载msi文件 安装完成后验证。配置gcc文件下bin环境。最后ctrlF5运行尝试。W…

机器学习 笔记

特征值提取 字典 from sklearn.extaction import DictVectorizer mDictVectorizer(sparseFalse)#sparse是否转换成三元组形式 data[], #传入字典数据 data1model.fit_transform(data) #使用API 英文特征值提取 from sklearn.feature_extraction.text import CountVe…

推荐一款好用的postman替代工具2024

Apifox 是国内团队自主研发的 API 文档、API 调试、API Mock、API 自动化测试一体化协作平台&#xff0c;是非常好的一款 postman 替代工具。 它通过一套系统、一份数据&#xff0c;解决多个系统之间的数据同步问题。只要定义好接口文档&#xff0c;接口调试、数据 Mock、接口…

项目模块十七:HttpServer模块

一、项目模块设计思路 目的&#xff1a;实现HTTP服务器搭建 思想&#xff1a;设计请求路由表&#xff0c;记录请求方法与对应业务的处理函数映射关系。用户实现请求方法和处理函数添加到路由表&#xff0c;服务器只接受请求并调用用户的处理函数即可。 处理流程&#xff1a; …

Android音视频直播低延迟探究之:WLAN低延迟模式

Android WLAN低延迟模式 Android WLAN低延迟模式是 Android 10 引入的一种功能&#xff0c;允许对延迟敏感的应用将 Wi-Fi 配置为低延迟模式&#xff0c;以减少网络延迟&#xff0c;启动条件如下&#xff1a; Wi-Fi 已启用且设备可以访问互联网。应用已创建并获得 Wi-Fi 锁&a…

requests库如何处理 - POST请求常见的两种请求体格式:表单格式JSON格式

目录&#xff1a; 每篇前言&#xff1a;一、POST请求的两种常见请求体格式详解1. 表单格式&#xff08;form-encoded&#xff09; - 举例&#xff1a;福州搜索示例代码&#xff08;表单数据&#xff09;&#xff1a; 2. JSON格式 - 举例&#xff1a;CSDN搜索示例代码&#xff0…

HCIP-HarmonyOS Application Developer 习题(二十二)

1、用户将手机导航迁移至智能手表之后&#xff0c;智能手表如果需要获取手机传过来的数据&#xff0c;从下列哪个方法中获取? A、onCompleteContinuation() B、onStartContinuation() C、onRestoreData() D、onSaveData() 答案&#xff1a;C 分析&#xff1a;FA发起迁移后&am…

LLMs之Code:Github Spark的简介、安装和使用方法、案例应用之详细攻略

LLMs之Code&#xff1a;Github Spark的简介、安装和使用方法、案例应用之详细攻略 目录 Github Spark的简介 Github Spark的安装和使用方法 1、安装 2、使用方法 Github Spark的案例应用 Github Spark的简介 2024年10月30日&#xff0c;GitHub 重磅发布GitHub Spark 是一…

会议直击|美格智能受邀出席第三届无锡智能网联汽车生态大会,共筑汽车产业新质生产力

11月10日&#xff0c;2024世界物联网博览会分论坛——第三届无锡智能网联汽车生态大会在无锡举行&#xff0c;美格智能CEO杜国彬受邀出席&#xff0c;并参与“中央域控&#xff1a;重塑汽车智能架构的未来”主题圆桌论坛讨论&#xff0c;与行业伙伴共同探讨智能网联汽车产业领域…