Skip to content

英文输入法

作者头像作者: 佚名 更新: 3/27/2025 字数: 0 字 时长: 0 分钟

题目描述

主管期望你来实现英文输入法单词联想功能。

  • 需求描述:

    • 依据用户输入的单词前缀,从已输入的英文语句中联想出用户想输入的单词,按字典序输出联想到的单词序列

    • 如果联想不到,请输出用户输入的单词前缀

  • 注意:

    • 英文单词联想时,区分大小写

    • 缩略形式如”don’t”,判定为两个单词,”don”和”t”

    • 输出的单词序列,不能有重复单词,且只能是英文单词,不能有标点符号

解题思路

给定一个字符串 s 和一个前缀字符串 pre,需要从字符串 s 中提取所有以 pre 开头的单词:

  • 按非字母字符分割字符串,提取单词。
  • 去重并按字典序排序单词。
  • 找出所有以 pre 开头的单词并返回,多个单词以空格分隔。
  • 如果没有找到符合条件的单词,则返回 pre 本身。

代码实现

javascript
const readline = require('readline');
 
// 创建读取标准输入的接口
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});
 
let s, t; // 用于存储输入的字符串和前缀
let inputCount = 0; // 记录输入的行数
 
// 监听每行输入
rl.on('line', (input) => {
    if (inputCount === 0) {
        s = input; // 第一行作为原始字符串 s
    } else if (inputCount === 1) {
        t = input; // 第二行作为前缀 t
        getResult(s, t); // 调用 getResult 函数处理结果
        rl.close(); // 关闭输入接口
    }
    inputCount++;
});
 
/**
 * 处理并输出以指定前缀开头的单词列表
 * @param {string} s 原始字符串
 * @param {string} t 前缀字符串
 */
function getResult(s, t) {
    // 按非字母字符分割字符串,提取单词
    let s1 = s.split(/[^a-zA-Z]/);
    // 去重
    let s2 = [...new Set(s1)];
    // 按字典序排序
    s2.sort();
    // 过滤出以 t 开头的单词
    s2 = s2.filter(x => x.startsWith(t));
 
    // 如果有符合条件的单词,打印结果;否则打印前缀 t
    if (s2.length > 0) {
        console.log(s2.join(' ')); // 以空格分隔打印结果
    } else {
        console.log(t); // 打印前缀 t
    }
}