#P3038. 英文输入法(100分)
          
                        
                                    
                      
        
              - 
          
          
                      1000ms
            
          
                      Tried: 184
            Accepted: 61
            Difficulty: 1
            
          
          
          
                       所属公司 : 
                              华为od
                                
            
                      
          
 
- 
                        算法标签>字符串          
 
英文输入法(100分)
思路:字符串匹配
第一行字符串为原字符串s,第二行字符串为前缀字符串pre,需要我们从原字符串中,找到与前缀字符串匹配的字符串,如果含有多个匹配的字符串,按照条件输出,不过需要提前预处理一下字符串,做一个去重操作。具体可以参考下面代码
JavaScript
// 引入 readline 模块
const readline = require('readline');
// 创建 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();  // 关闭 readline 接口,结束程序
  }
  inputCount++;  // 输入计数器递增
});
// 处理输入并输出结果的函数
function getResult(s, t) {
  // 使用正则表达式分割字符串 s,得到 s1 数组
  let s1 = s.split(/[^a-zA-Z]/);
  // 使用 Set 对数组 s1 进行去重
  let s2 = [...new Set(s1)];
  // 对去重后的数组进行排序
  s2.sort();
  // 过滤出以 t 开头的字符串
  s2 = s2.filter(x => x.startsWith(t));
  // 判断是否有匹配结果
  if (s2.length > 0) {
    console.log(s2.join(' '));  // 输出匹配结果并用空格连接
  } else {
    console.log(t);  // 若无匹配结果,则输出 t
  }
}
Java
import java.util.Scanner;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();  // 读取第一行输入
        String t = sc.nextLine();  // 读取第二行输入
        String[] s1 = s.split("[^a-zA-Z]");  // 使用正则表达式分割字符串 s,得到 s1 数组
        List<String> s2 = new ArrayList<String>(new HashSet<String>(Arrays.asList(s1)));  // 利用 Set 对 s1 数组进行去重
        s2.sort(null);  // 对去重后的数组进行排序
        s2.removeIf(x -> !x.startsWith(t));  // 移除不以 t 开头的字符串
        // 判断是否有匹配结果
        if (s2.size() > 0) {
            System.out.println(String.join(" ", s2));  // 输出匹配结果并用空格连接
        } else {
            System.out.println(t);  // 若无匹配结果,则输出 t
        }
    }
}
Python
import re  # 导入re模块
 
s = input()  # 读取输入的字符串s
t = input()  # 读取输入的字符串t
 
s1 = re.split("[^a-zA-Z]", s)  # 使用正则表达式将字符串s按非字母字符分割
s2 = list(set(s1))  # 将分割后的结果转为集合去重,再转为列表
s2.sort()  # 对列表进行排序
s2 = list(filter(lambda x: x.startswith(t), s2))  # 过滤出以t开头的字符串
if len(s2) > 0:  # 如果过滤后的列表长度大于0
    print(" ".join(s2))  # 输出连接后的字符串
else:  # 否则
    print(t)  # 输出字符串t
C++
#include<bits/stdc++.h>
using namespace std;
string s , t;
int main() {
    getline(cin, s);
    getline(cin, t);
    vector<string> arr;
    string tmp = "";
    for (int i = 0; i < s.size(); i++) {
        if (isalpha(s[i])) {
            tmp += s[i];
        } else {
            arr.push_back(tmp);
            tmp = "";
        }
    }
    if (tmp != "") arr.push_back(tmp);
    sort(arr.begin(), arr.end());
    arr.erase(unique(arr.begin(), arr.end()), arr.end());
    vector<string> ans;
    for (int i = 0; i < arr.size(); i++) {
        if (arr[i].find(t) == 0) {
            ans.push_back(arr[i]);
        }
    }
    if (ans.size() == 0) {
        cout << t << endl;
        return 0;
    }
    string res = "";
    for (auto x : ans){
        res += x + " ";
    }
    res.pop_back();
    cout << res << endl;
    return 0;
}
        题目描述
主管期望你来实现英文输入法单词联想功能。需求如下:
依据用户输入的单词前缀,从已输入的英文语句中联想出用户想输入的单词,按字典序输出联想到的单词序列,如果联想不到,请输出用户输入的单词前缀。
注意:
1,英文单词联想时,区分大小写
2,缩略形式如"don’t”,判定为两个单词,"don“和"t“
3,输出的单词序列,不能有重复单词,且只能是英文单词,不能有标点符号
输入描述
输入为两行,
首行输入一段由英文单词word和标点符号组成的语句str;
接下来一行为一个英文单词前缀pre
0<word.length()⩽20
0<str.length()⩽1000
0<pre⩽20
输出描述
输出符合要求的单词序列或单词前缀,存在多个时,单词之间以单个空格分割;
样例1
输入
I love you
He
输出
He
说明
从用户已输入英文语句"l love you”中提炼出“I”、“love”、“you”三个单词,接下来用户输入”He”,从已输入信息中无法联想到任何符合要求的单词,因此输出用户输入的单词前缀.
样例2
输入
The furthest distance in the world, ls not between life and death, But when I stand in front of you, Yet you don't know that I love you.
f
输出
front furthest
说明
从用启已输入英文语句"The furthest distance in the world, Is notbetween life and death, But when I stand in frontof you, Yet youdontknow that I love you"中提炼出的单词,符合"f"作为前缀的有"furthest"和"front",按字典序排序并在单词间添加空格后输出,结果为“front furthest"