news 2026/6/10 11:18:20

机试真题——识文断句(2025B卷:200分)Java/python/JavaScript/C++/C最佳实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
机试真题——识文断句(2025B卷:200分)Java/python/JavaScript/C++/C最佳实现


给定一些短词字符串作为分割词,去分割一段长字符串。从前往后遍历分割词,查找并分割长字符串为对应的token。分词规则如下:
1.优先匹配最长分割词:若多个分割词可匹配同一位置,选择长度最长的;长度相同时,按字典序较大的优先。
2.未匹配部分保留原样:无法匹配分割词的部分直接作为独立token输出。
3.输出格式:每个token用括号包裹,按原字符串顺序输出。


输入描述:
短词字符串列表,每行一个,空行后输入待分割的长字符串。

输出描述:
括号包裹的分词结果,如(token1)(token2)


示例1:
输入:

zhong guo
zhong
guo
wo
mei guo

wo ai zhong guo mei guo ye xing

输出:

(wo)(ai)(zhong guo)(mei guo)(ye)(xing)

问题分析

给定一组分割词和一个长字符串,需要按照特定规则将长字符串分割为多个token。规则包括优先匹配最长分割词、字典序排序以及未匹配部分保留原样。输出格式要求用括号包裹每个token。

解决思路

  1. 分割词预处理:将分割词按长度从长到短排序,长度相同的按字典序降序排列。
  2. 遍历分割词:从长到短依次检查长字符串中是否有匹配的分割词。
  3. 分割字符串:匹配到的部分作为token,未匹配的部分保留原样。
  4. 输出结果:将所有token按顺序用括号包裹输出。

代码实现

以下是Python、C++、Java、JavaScript和C语言的实现代码。

Python实现
def tokenize(segments, text): # 预处理分割词:按长度降序,长度相同按字典序降序 segments.sort(key=lambda x: (-len(x), x), reverse=False) tokens = [] i = 0 n = len(text) while i < n: matched = False for seg in segments: seg_len = len(seg) if i + seg_len <= n and text[i:i+seg_len] == seg: tokens.append(seg) i += seg_len matched = True break if not matched: # 处理未匹配部分(按空格分割) if text[i] == ' ': i += 1 else: j = i while j < n and text[j] != ' ': j += 1 tokens.append(text[i:j]) i = j return tokens # 读取输入 segments = [] while True: line = input().strip() if line == '': break segments.append(line) text = input().strip() # 分词 tokens = tokenize(segments, text) # 输出结果 print(''.join(f'({token})' for token in tokens))
C++实现
#include <iostream> #include <vector> #include <algorithm> #include <string> using namespace std; vector<string> tokenize(vector<string>& segments, string text) { // 预处理分割词:按长度降序,长度相同按字典序降序 sort(segments.begin(), segments.end(), [](const string& a, const string& b) { if (a.length() == b.length()) { return a > b; } return a.length() > b.length(); }); vector<string> tokens; int i = 0; int n = text.length(); while (i < n) { bool matched = false; for (const string& seg : segments) { int seg_len = seg.length(); if (i + seg_len <= n && text.substr(i, seg_len) == seg) { tokens.push_back(seg); i += seg_len; matched = true; break; } } if (!matched) { if (text[i] == ' ') { i++; } else { int j = i; while (j < n && text[j] != ' ') { j++; } tokens.push_back(text.substr(i, j - i)); i = j; } } } return tokens; } int main() { vector<string> segments; string line; while (getline(cin, line)) { if (line.empty()) { break; } segments.push_back(line); } string text; getline(cin, text); vector<string> tokens = tokenize(segments, text); for (const string& token : tokens) { cout << "(" << token << ")"; } cout << endl; return 0; }
Java实现
import java.util.*; public class Main { public static List<String> tokenize(List<String> segments, String text) { // 预处理分割词:按长度降序,长度相同按字典序降序 segments.sort((a, b) -> { if (a.length() == b.length()) { return b.compareTo(a); } return Integer.compare(b.length(), a.length()); }); List<String> tokens = new ArrayList<>(); int i = 0; int n = text.length(); while (i < n) { boolean matched = false; for (String seg : segments) { int segLen = seg.length(); if (i + segLen <= n && text.substring(i, i + segLen).equals(seg)) { tokens.add(seg); i += segLen; matched = true; break; } } if (!matched) { if (text.charAt(i) == ' ') { i++; } else { int j = i; while (j < n && text.charAt(j) != ' ') { j++; } tokens.add(text.substring(i, j)); i = j; } } } return tokens; } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); List<String> segments = new ArrayList<>(); while (true) { String line = scanner.nextLine(); if (line.isEmpty()) { break; } segments.add(line); } String text = scanner.nextLine(); List<String> tokens = tokenize(segments, text); for (String token : tokens) { System.out.print("(" + token + ")"); } System.out.println(); } }
JavaScript实现
function tokenize(segments, text) { // 预处理分割词:按长度降序,长度相同按字典序降序 segments.sort((a, b) => { if (a.length === b.length) { return b.localeCompare(a); } return b.length - a.length; }); const tokens = []; let i = 0; const n = text.length; while (i < n) { let matched = false; for (const seg of segments) { const segLen = seg.length; if (i + segLen <= n && text.substring(i, i + segLen) === seg) { tokens.push(seg); i += segLen; matched = true; break; } } if (!matched) { if (text[i] === ' ') { i++; } else { let j = i; while (j < n && text[j] !== ' ') { j++; } tokens.push(text.substring(i, j)); i = j; } } } return tokens; } // 读取输入 const readline = require('readline'); const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); const segments = []; let text = ''; let isText = false; rl.on('line', (line) => { if (line === '') { isText = true; } else if (!isText) { segments.push(line); } else { text = line; rl.close(); } }).on('close', () => { const tokens = tokenize(segments, text); console.log(tokens.map(token => `(${token})`).join('')); });
C语言实现
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { char **segments; int count; } SegmentList; int compare_segments(const void *a, const void *b) { const char *seg_a = *(const char **)a; const char *seg_b = *(const char **)b; int len_a = strlen(seg_a); int len_b = strlen(seg_b); if (len_a == len_b) { return strcmp(seg_b, seg_a); } return len_b - len_a; } void tokenize(SegmentList *segments, const char *text, char ***tokens, int *token_count) { *tokens = NULL; *token_count = 0; int i = 0; int n = strlen(text); while (i < n) { int matched = 0; for (int j = 0; j < segments->count; j++) { const char *seg = segments->segments[j]; int seg_len = strlen(seg); if (i + seg_len <= n && strncmp(text + i, seg, seg_len) == 0) { (*token_count)++; *tokens = realloc(*tokens, *token_count * sizeof(char *)); (*tokens)[*token_count - 1] = strdup(seg); i += seg_len; matched = 1; break; } } if (!matched) { if (text[i] == ' ') { i++; } else { int j = i; while (j < n && text[j] != ' ') { j++; } (*token_count)++; *tokens = realloc(*tokens, *token_count * sizeof(char *)); (*tokens)[*token_count - 1] = strndup(text + i, j - i); i = j; } } } } int main() { SegmentList segments; segments.segments = NULL; segments.count = 0; char line[1024]; while (fgets(line, sizeof(line), stdin)) { line[strcspn(line, "\n")] = '\0'; if (line[0] == '\0') { break; } segments.count++; segments.segments = realloc(segments.segments, segments.count * sizeof(char *)); segments.segments[segments.count - 1] = strdup(line); } fgets(line, sizeof(line), stdin); line[strcspn(line, "\n")] = '\0'; const char *text = line; qsort(segments.segments, segments.count, sizeof(char *), compare_segments); char **tokens = NULL; int token_count = 0; tokenize(&segments, text, &tokens, &token_count); for (int i = 0; i < token_count; i++) { printf("(%s)", tokens[i]); free(tokens[i]); } printf("\n"); free(tokens); for (int i = 0; i < segments.count; i++) { free(segments.segments[i]); } free(segments.segments); return 0; }

代码说明

  1. 预处理分割词:将分割词按长度和字典序排序,确保优先匹配最长且字典序较大的分割词。
  2. 分割字符串:遍历长字符串,依次检查是否有匹配的分割词,匹配到的部分作为token,未匹配的部分按空格分割。
  3. 输出结果:将所有token用括号包裹并按顺序输出。

以上代码实现了题目要求的功能,适用于多种编程语言。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 21:09:23

LangFlow与Notion类笔记软件同步更新策略

LangFlow与Notion类笔记软件同步更新策略 在AI应用开发日益普及的今天&#xff0c;一个核心矛盾逐渐显现&#xff1a;技术能力越强的开发者&#xff0c;越倾向于写代码构建智能体&#xff1b;而真正需要使用这些工具的产品、运营甚至教育工作者&#xff0c;却因编程门槛望而却步…

作者头像 李华
网站建设 2026/6/10 9:20:17

沈阳景观灯采购指南

在城市照明体系中&#xff0c;景观灯不仅承担着基础照明功能&#xff0c;更成为塑造城市夜景美学的重要载体。以沈阳为例&#xff0c;这座东北重镇近年来持续推进城市更新与夜间经济建设&#xff0c;对高品质、高适配性的户外照明产品需求显著增长。据行业数据显示&#xff0c;…

作者头像 李华
网站建设 2026/6/9 4:51:59

【分析式AI】-朴素贝叶斯算法模型

朴素贝叶斯&#xff08;Naive Bayes&#xff09;是基于贝叶斯定理和特征条件独立假设的经典分类模型——核心逻辑是“通过已知的‘先验概率’和‘特征概率’&#xff0c;计算‘后验概率’&#xff0c;最终选择概率最高的类别作为预测结果”。 它的“朴素”&#xff08;Naive&a…

作者头像 李华
网站建设 2026/6/8 8:16:32

基于SpringBoot的校园设备维护报修系统

随着社会平均生活水平提高&#xff0c;各高校也开始改善校园日常工作生活环境&#xff0c;为此许多高校为提高校内人员生活工作体验购入大量基础设备&#xff0c;如公共饮水机、公共健身娱乐器材等。随着设备数量的增加&#xff0c;设备出现故障的问题也越发频繁。传统的高校报…

作者头像 李华
网站建设 2026/6/7 16:58:21

Docker本地部署AutoGPT完整指南

Docker本地部署AutoGPT完整指南 在大语言模型&#xff08;LLM&#xff09;飞速演进的今天&#xff0c;我们早已过了“问一句答一句”的阶段。像ChatGPT这样的工具固然强大&#xff0c;但它们本质上仍是被动响应——你得清楚地知道怎么提问、需要什么信息&#xff0c;才能得到满…

作者头像 李华
网站建设 2026/6/8 14:35:32

【车辆侧向速度估计】基于Carsim和simulink联合仿真,利用车辆运动学模型和卡尔曼滤波算法

【车辆侧向速度估计】基于Carsim和simulink联合仿真&#xff0c;利用车辆运动学模型和卡尔曼滤波算法&#xff0c;分析卡尔曼滤波的可观性&#xff0c;通过利用轮速信息和加速度信息对难以直接测量的车辆侧向车速进行估计。 文档详实】刚摸完方向盘的手还在发烫&#xff0c;屏幕…

作者头像 李华