当前位置: 首页 > news >正文

中文分词模拟器 - 华为OD统一考试(Java 题解)

alt

题目描述

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

说明:

  • 精确分词:字符串分词后,不会出现重叠。例如 “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输出:
i,love,china说明:
输入的字符串被按最长匹配原则分为 "i", "love", "china"。

示例2

输入:
ilovech
i,love,china,ch,na,ve,lo,this,is,the,word输出:
i,love,ch说明:
输入的字符串被按最长匹配原则分为 "i", "love", "ch"。

题解

这道题目属于字符串处理和字典树(Trie)应用的题目。题解思路如下:

  1. 构建字典树(Trie)
    • 使用字典树来存储词库中的单词,方便高效地进行查找和匹配。
  2. 分词过程
    • 对输入的字符串进行遍历,从当前位置向后进行匹配。
    • 尽量匹配最长的单词,如果匹配成功,则将该单词加入结果列表。
    • 如果没有匹配到词库中的任何单词,则将当前字符作为一个单词加入结果列表。
  3. 时间复杂度
    • 构建字典树的时间复杂度是 O(n),其中 n 为词库中所有单词的总长度。
    • 分词的时间复杂度是 O(m),其中 m 为待分词字符串的长度。
  4. 空间复杂度
    • 字典树的空间复杂度是 O(n),其中 n 为词库中所有单词的总长度。

Java

import java.util.*;
/*** @author code5bug*/
class TrieNode {Map<Character, TrieNode> children = new HashMap<>();boolean isEndOfWord = false;
}class Trie {private final TrieNode root;public Trie() {root = new TrieNode();}public void insert(String word) {TrieNode node = root;for (char ch : word.toCharArray()) {node.children.putIfAbsent(ch, new TrieNode());node = node.children.get(ch);}node.isEndOfWord = true;}public List<String> searchAll(String text) {List<String> result = new ArrayList<>();int length = text.length();for (int i = 0; i < length; ) {TrieNode node = root;int longestMatch = -1;for (int j = i; j < length; j++) {char ch = text.charAt(j);if (!node.children.containsKey(ch)) {break;}node = node.children.get(ch);if (node.isEndOfWord) {longestMatch = j;}}if (longestMatch == -1) {result.add(text.substring(i, i + 1));i++;} else {result.add(text.substring(i, longestMatch + 1));i = longestMatch + 1;}}return result;}
}public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);String text = scanner.nextLine().trim();String[] dictionaryWords = scanner.nextLine().trim().split(",");Trie trie = new Trie();for (String word : dictionaryWords) {trie.insert(word);}List<String> segmentedWords = trie.searchAll(text);System.out.println(String.join(",", segmentedWords));}
}

希望这个专栏不仅能帮您成功通过华为机试,还能让您熟练掌握算法。

整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

http://www.dtcms.com/a/290730.html

相关文章:

  • CS231n-2017 Lecture5神经网络笔记
  • 【Java EE初阶 --- 网络原理】应用层---HTTP(HTTPS)协议
  • 内网与外网是通过什么进行传输的?内外网文件传输的安全方法
  • Java从入门到精通 - 面向对象高级(三)
  • kafka 生产和消费 性能测试工具 kafka-producer-perf-test.sh kafka-consumer-perf-test.sh
  • kafka 生产消息和消费消息 kafka-console-producer.sh kafka-console-consumer.sh
  • Python 进阶(六): Word 基本操作
  • ROS 与 Ubuntu 版本的对应关系
  • 初学者STM32—USART
  • 了解类加载器吗?类加载器的类型有哪些?
  • Java 大视界 -- 基于 Java 的大数据分布式计算在地球物理勘探数据处理与地质结构建模中的应用(356)
  • 鹏鼎控股入职测评综合能力真题SHL测评题库2025年攻略
  • postgresql16.4 配置 数据库主从
  • PyTorch 实现 CIFAR-10 图像分类:从数据预处理到模型训练与评估
  • git bash命令不够完善,想整合msys2该怎么办?
  • 02-UE5蓝图初始的三个节点作用
  • 文娱投资的逆势突破:博派资本的文化旅游综合体战略
  • 阿里云宝塔Linux面板相关操作记录
  • 照片to谷歌地球/奥维地图新增功能:导出 GeoJSON 数据
  • 高级技术【Java】【反射】【注解】【动态代理】
  • c++:父类的析构函数定义为纯虚函数注意事项
  • “专属私有云”或“行业公有云(逻辑隔离的公共云专区)”两种主流部署模式到底有什么区别?政务云不就应该是专属的私有云么?政务云是不是不能混用?
  • 网络编程基础:从 OSI 模型到 TCP/IP 协议族的全面解析
  • 【AI高性能网络解析】第三期:数据快递,海量数据跨广域高效传输技术实践
  • 计算机网络:概述层---计算机网络的组成和功能
  • harbor镜像仓库由原来的v2.11.1版本升级到v2.13.1,数据不丢失
  • Taro 生命周期相关 API 详解
  • HTML整理
  • Lists的分批次操作
  • 安卓第一个项目