中文分词模拟器【华为OD机试-JAVAPythonC++JS】

news2024/9/21 4:38:54

题目描述

给定一个连续不包含空格字符串,该字符串仅包含英文小写字母及英文文标点符号(逗号、分号、句号),同时给定词库,对该字符串进行精确分词。
说明:
1.精确分词: 字符串分词后,不会出现重叠。即“ilovechina” ,不同词库可分割为 “i,love,china” “ilove,china”,不能分割出现重叠的"i,ilove,china",i重叠出现
2.标点符号不成词,仅用于断句
3.词库:根据外部知识库统计出来的常用词汇例:dictionary=[“i”,“love”,“china”,“lovechina”,“ilove”],
4.分词原则:采用分词顺序优先且最长匹配原则
“ilovechina”,假设分词结果 [ i,ilove,lo,love,ch,china,lovechina ] 则输出 [ilove,china]
错误输出:[i,lovechina], 原因:"ilove ">优先于 "lovechina"成词
错误输出:[i,love,china] 原因:“ilove” >“i” 遵循最长匹配原则
输入描述:
字符串长度限制:0<length<256
词库长度限制: 1<length<100000
第一行输入待分词语句 “ilovechina”
第二行输入中文词库 “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
说明:
示例2
输入:
iat
i,love,china,ch,na,ve,lo,this,is,the,word,beauti,tiful,ful
输出:
i,a,t
说明:
单个字母,不在词库中且不成词则直接输出单个字母
示例3
输入:
ilovechina,thewordisbeautiful
i,love,china,ch,na,ve,lo,this,is,the,word,beauti,tiful,ful
输出:
i,love,china,the,word,is,beauti,ful
说明:
标点符号为英文标点符号

解题思路

  1. 首先,构建一个字典树(Trie)来存储词库中的所有词汇,以便能够高效地进行匹配。
  2. 对输入的字符串进行遍历,从左到右依次匹配字典树中的词汇。
  3. 在匹配过程中,遵循最长匹配原则,即尽量匹配更长的词汇。
  4. 如果当前位置能够匹配一个词汇,将该词汇加入结果中,并将匹配位置移动到词汇的末尾。
  5. 继续遍历,重复步骤3和步骤4,直至整个字符串被匹配完毕。
  6. 输出结果即为分词后的字符串。

通过以上步骤,可以保证在满足分词顺序和最长匹配原则的前提下,得到正确的分词结果。在实现时,可以使用递归或迭代的方式来遍历字符串并匹配词汇。同时,为了提高效率,可以使用动态规划或其他优化方法来避免重复计算。

题解代码

Python题解代码

def word_segmentation(s, dictionary):
    n = len(s)
    dp = [False] * (n + 1)
    dp[0] = True
    result = []

    for i in range(1, n + 1):
        for j in range(i - 1, -1, -1):
            if dp[j] and s[j:i] in dictionary:
                dp[i] = True
                break

    if not dp[n]:
        return [s[i] for i in range(n)]

    i = n
    while i > 0:
        for j in range(i - 1, -1, -1):
            if dp[j] and s[j:i] in dictionary:
                result.insert(0, s[j:i])
                i = j
                break

    return result


if __name__ == "__main__":
    input_string = input().strip()
    dictionary = input().strip().split(',')

    result = word_segmentation(input_string, dictionary)
    print(','.join(result))


JAVA题解代码

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

public class WordSegmentation {

    public static List<String> wordSegmentation(String s, List<String> dictionary) {
        int n = s.length();
        boolean[] dp = new boolean[n + 1];
        dp[0] = true;
        List<String> result = new ArrayList<>();

        for (int i = 1; i <= n; i++) {
            for (int j = i - 1; j >= 0; j--) {
                if (dp[j] && dictionary.contains(s.substring(j, i))) {
                    dp[i] = true;
                    break;
                }
            }
        }

        if (!dp[n]) {
            for (int i = 0; i < n; i++) {
                result.add(String.valueOf(s.charAt(i)));
            }
            return result;
        }

        int i = n;
        while (i > 0) {
            for (int j = i - 1; j >= 0; j--) {
                if (dp[j] && dictionary.contains(s.substring(j, i))) {
                    result.add(0, s.substring(j, i));
                    i = j;
                    break;
                }
            }
        }

        return result;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        String inputString = scanner.nextLine().trim();
        String[] dictionaryArray = scanner.nextLine().trim().split(",");
        List<String> dictionary = Arrays.asList(dictionaryArray);

        List<String> result = wordSegmentation(inputString, dictionary);
        System.out.println(String.join(",", result));
    }
}


C/C++题解代码

#include <iostream>
#include <vector>
#include <sstream>

using namespace std;

vector<string> wordSegmentation(const string& s, const vector<string>& dictionary) {
    int n = s.length();
    vector<bool> dp(n + 1, false);
    dp[0] = true;
    vector<string> result;

    for (int i = 1; i <= n; i++) {
        for (int j = i - 1; j >= 0; j--) {
            if (dp[j] && find(dictionary.begin(), dictionary.end(), s.substr(j, i - j)) != dictionary.end()) {
                dp[i] = true;
                break;
            }
        }
    }

    if (!dp[n]) {
        for (int i = 0; i < n; i++) {
            result.push_back(string(1, s[i]));
        }
        return result;
    }

    int i = n;
    while (i > 0) {
        for (int j = i - 1; j >= 0; j--) {
            if (dp[j] && find(dictionary.begin(), dictionary.end(), s.substr(j, i - j)) != dictionary.end()) {
                result.insert(result.begin(), s.substr(j, i - j));
                i = j;
                break;
            }
        }
    }

    return result;
}

int main() {
    string inputString, dictionaryString;
    getline(cin, inputString);
    getline(cin, dictionaryString);

    vector<string> dictionary;
    stringstream ss(dictionaryString);
    string word;
    while (getline(ss, word, ',')) {
        dictionary.push_back(word);
    }

    vector<string> result = wordSegmentation(inputString, dictionary);
    cout << result[0];
    for (int i = 1; i < result.size(); i++) {
        cout << "," << result[i];
    }

    return 0;
}


JS题解代码

function wordSegmentation(s, dictionary) {
    const n = s.length;
    const dp = new Array(n + 1).fill(false);
    dp[0] = true;
    const result = [];

    for (let i = 1; i <= n; i++) {
        for (let j = i - 1; j >= 0; j--) {
            if (dp[j] && dictionary.includes(s.substring(j, i))) {
                dp[i] = true;
                break;
            }
        }
    }

    if (!dp[n]) {
        for (let i = 0; i < n; i++) {
            result.push(s.charAt(i));
        }
        return result;
    }

    let i = n;
    while (i > 0) {
        for (let j = i - 1; j >= 0; j--) {
            if (dp[j] && dictionary.includes(s.substring(j, i))) {
                result.unshift(s.substring(j, i));
                i = j;
                break;
            }
        }
    }

    return result;
}

// 读取输入
const readline = require('readline');
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

let inputString = '';
let dictionaryString = '';

rl.question('请输入待分词语句: ', (s) => {
    inputString = s;

    rl.question('请输入词库: ', (dict) => {
        dictionaryString = dict;

        const dictionary = dictionaryString.split(',');
        const result = wordSegmentation(inputString, dictionary);
        console.log(result.join(', '));

        rl.close();
    });
});


代码OJ评判结果

通过测试点。

代码讲解

Python代码解释:

这段Python代码通过动态规划解决了分词问题。以下是主要组成部分:

  • word_segmentation函数: 接受一个字符串s和一个单词列表dictionary作为输入,并根据给定的规则返回一个分词的单词列表。
  • 动态规划: 使用动态规划检查输入字符串的子串是否可以分割为词库中的单词。它通过迭代输入字符串,更新一个布尔数组dp来标记有效的分词点。
  • 分词检索: 在确定了有效的分词点之后,通过回溯动态规划数组构建分词后的单词列表。

Java代码解释:

这段Java代码类似于Python的实现。以下是主要的组成部分:

  • wordSegmentation方法: 接受一个字符串s和一个字符串列表dictionary作为输入,并返回根据给定规则进行分词后的列表。
  • 动态规划: 使用动态规划检查输入字符串的子串是否可以分割为词库中的单词。它通过迭代输入字符串,更新一个布尔数组dp来标记有效的分词点。
  • 分词检索: 在确定了有效的分词点之后,通过回溯动态规划数组构建分词后的单词列表。

C++代码解释:

这段C++代码是Python和Java代码的类似实现。以下是主要的组成部分:

  • wordSegmentation函数: 接受一个字符串s和一个字符串向量dictionary作为输入,并返回根据给定规则进行分词后的向量。
  • 动态规划: 使用动态规划检查输入字符串的子串是否可以分割为词库中的单词。它通过迭代输入字符串,更新一个布尔数组dp来标记有效的分词点。
  • 分词检索: 在确定了有效的分词点之后,通过回溯动态规划数组构建分词后的单词向量。

JavaScript代码解释:

这段JavaScript代码使用了Node.js的readline模块来读取输入。以下是主要的组成部分:

  • wordSegmentation函数: 接受一个字符串s和一个字符串数组dictionary作为输入,并返回根据给定规则进行分词后的数组。
  • 动态规划: 使用动态规划检查输入字符串的子串是否可以分割为词库中的单词。它通过迭代输入字符串,更新一个布尔数组dp来标记有效的分词点。
  • 分词检索: 在确定了有效的分词点之后,通过回溯动态规划数组构建分词后的单词数组。

这些代码在不同的编程语言中采用了相似的思路,使用动态规划解决了精确分词的问题。

寄语

🚀✨ 朋友,希望你的华为OD机试就像是一场轻松的技术party!愿你的代码如同畅快的音符,跳跃在键盘上,最后弹奏出一曲高分之歌。加油,你是技术舞台上的巨星!通过机试,就像是风轻云淡,轻轻松松就把高分收入囊中。祝愿你的编程之旅一路顺风,破风前行,每一行代码都是成功的注脚!🌈💻

在这里插入图片描述

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

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

相关文章

ywtool network命令

提示:工具下载链接在文章最后 目录 一.network功能介绍二.配置network功能2.1 network_ip配置检查 2.2 network_br配置2.2.1 配置的网桥原先不存在检查2.2.2 配置的网桥已存在-修改网桥IP检查2.2.3 配置的网桥已存在-只添加网卡到网桥里检查 2.3 network_bond配置检查 2.4 netw…

金仕达与 DolphinDB 建立深度合作,共筑 FICC 科技创新新篇章

从“关起门做交易”到“打开门做服务”&#xff0c;国内 FICC 业务正经历从自营到市场化服务的转变&#xff0c;借助数据分析、算法交易等技术的快速发展&#xff0c;交易团队能够更加主动地发现市场需求&#xff0c;为不同客群提供更好的做市业务&#xff0c;FICC 交易电子化已…

基于Python3的数据结构与算法 - 07 归并排序

一、归并 引入 假设现在的列表分两段有序&#xff0c;如何将其合并成为一个有序列表。 这种操作成为一次归并。 归并的思路 分别对两个列表进行遍历&#xff0c;比较两个列表中的最小值&#xff0c;将更小的取出来。取出后一次进行上操作&#xff0c;直到其中一个列表中的元…

web自动化笔记六:弹出框处理

1、弹出框类型&#xff1a; 1)、alert 警告框 2)、confirm 确认框 3)、prompt 提示框 2、弹出框处理方法&#xff08;方法三种弹出框操作都一样&#xff09; 1)、获取弹出框对象&#xff1a; alert driver.switch_to.ale…

笔记72:关于IMU(惯性测量单元)传感器的作用【不涉及公式推导】

一、IMU传感器是什么&#xff1a; 惯性测量单元IMU&#xff08;Inertial Measurement Unit&#xff09;是一种使用【加速度计】和【陀螺仪】来测量【物体三轴姿态角&#xff08;空间姿态&#xff09;】的装置&#xff1b;IMU在坐标系的每个坐标轴上&#xff0c;均安装有1个陀螺…

Unity(第十八部)物理力学,碰撞,触发、关节和材质

1、重力 刚体组件 英文中文描述RigidBody刚体组件physics->rigidbody &#xff0c;刚体组件使一个物体有了质量&#xff0c;重力等。&#xff0c;use gravity 勾选后&#xff0c;物体才会受到重力&#xff0c;会自动下落&#xff0c;取消勾选就不会。&#xff0c;&#xf…

初学JavaScript总结

0 JavaScript html完成了架子&#xff0c;css做了美化&#xff0c;但是网页是死的&#xff0c;需要给他注入灵魂&#xff0c;所以接下来需要学习JavaScript&#xff0c;这门语言会让页面能够和用户进行交互。JavaScript又称为脚本语言&#xff0c;可以通过脚本实现用户和页面的…

1.1为什么需要对数值类型的特征做归一化?

01 知识点&#xff1a;特征归一化&#xff08;第一章 特征工程&#xff09; 摘要&#xff1a; 为什么需要对数值类型的特征做归一化&#xff1f; 简要回答&#xff1a;对数值类型的特征做归一化&#xff0c;使得各指标除以同一个数量级&#xff0c;以便进行分析。 场景描述 为…

AI时代来临:解锁大模型的神秘面纱!

在AI时代的黎明&#xff0c;大模型技术的发展不仅仅是科技进步的一个标志&#xff0c;更是人类文明新篇章的开启。这篇文章旨在揭开大模型的神秘面纱&#xff0c;探索其对未来社会的深远影响。 大模型&#xff0c;作为人工智能领域的一个重要分支&#xff0c;其核心在于构建能…

内网搭建mysql8.0并搭建主从复制详细教程!!!

一、安装mysql 1.1 mysql下载链接&#xff1a; https://downloads.mysql.com/archives/community/ 1.2 解压包并创建相应的数据目录 tar -xvf mysql-8.2.0-linux-glibc2.28-x86_64.tar.xz -C /usr/local cd /usr/local/ mv mysql-8.2.0-linux-glibc2.28-x86_64/ mysql mkdir…

Pytorch学习 day01(Jupyter安装、常用函数、三种编辑器的对比)

Jupyter 安装过程中遇到的问题&#xff1a; Anaconda的base环境会自动安装Jupyter&#xff0c;但是如果我们要在其他环境中安装Jupyter&#xff0c;就需要注意&#xff0c;该环境的python版本不能高于3.11&#xff0c;且用以下代码安装&#xff1a; conda install nb_conda_…

迭代模型:让项目管理更加高效与灵活

迭代模型&#xff1a;让项目管理更加高效与灵活 在当今快速变化的市场环境中&#xff0c;项目管理面临着前所未有的挑战。传统的瀑布模型已无法满足不断变化的需求&#xff0c;而迭代模型则以其灵活性和适应性成为了项目管理的新宠。本文将详细介绍迭代模型的概念、特点、应用…

基于vue3 BIMFACE 单楼层平滑切换

模型加载 vue3使用hooks实现模型的加载 hooks文件: useBimLoad.js import { getAccessToken, getViewToken } from "/api/bimface";//获取accessToken和viewToken&#xff0c;自行编写 import { toRefs } from "vue";export function useBimLoad(props)…

Android Tombstone 分析

1.什么是tombstone Tombstone是指在分布式系统中用于标记数据已被删除的记录&#xff0c;通常包含删除操作的时间戳和相关信息。 当一个动态库&#xff08;native程序&#xff09;开始执行时&#xff0c;系统会注册一些连接到 debuggerd 的signal handlers。当系统发生崩溃时…

浪潮服务器使用ARCCONF查看RAID配置信息

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、获取ARCCONF二、使用步骤1.Windows Server 20221.查看RAID控制器2.查询控制器属性3.查询虚拟磁盘属性4.查询物理硬盘属性 2.Ubuntu-22.043.CentOS7 三、配置…

精益工程师3000工资与30000工资的区别!

在同一职场征程中&#xff0c;为何有的精益工程师月入仅三千&#xff0c;而另一些则能达到三万&#xff1f;这一差距&#xff0c;远超薪酬数额的简单对比&#xff0c;它深刻反映了专业能力、工作态度和个人品质的全面差异。 首先&#xff0c;对于刚踏入职场的精益工程师而言&a…

1.3 vue ui框架-element-ui框架

1 前言 ElementUI是一套基于VUE2.0的桌面端组件库&#xff0c;ElementUI提供了丰富的组件帮助开发人员快速构建功能强大、风格统一的页面。 ElementUI官网 https://element.eleme.io 2 安装 运行命令 cnpm i element-ui -S -S表示只在该项目下安装&#xff0c;不是全局安…

Springboot配置定时任务

介绍SpringBoot集成定时任务的过程。 目 录 1、引入相关依赖 2、启动类添加注解 3、定时任务类添加注解 4、cron表达式 5、总结 1、引入相关依赖 SpringBoot自带定时任务配置&#xff0c;只要引入springboot相关类即可。 2、启动类添加注解 在启动类上添加注解EnableSch…

【学习心得】Python调用JS的三种常用方法

在做JS逆向的时候&#xff0c;一种情况是直接用Python代码复现JS代码的功能&#xff0c;达成目的。但很多时候这种方法有明显的缺点&#xff0c;那就是一旦JS代码逻辑发生了更改&#xff0c;你就得重写Python的代码逻辑非常不便。于是第二种情况就出现了&#xff0c;我直接得到…

CDN CloudFlare 接入 OCI 对象存储

在当今数字化时代&#xff0c;网站性能和可用性是业务成功的关键。为了提供快速且可靠的访问体验&#xff0c;许多组织正在寻找有效的内容分发网络&#xff08;CDN&#xff09;解决方案。CloudFlare作为业界领先的CDN提供商&#xff0c;其强大的全球网络基础设施能够加速网站内…