#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"