华为 OD 真题机考 - 英文输入法(Java)
最编程
2024-09-30 09:04:38
...
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Autocomplete {
public static void main(String[] args) {
// String sentence = "The furthest distance in the world, Is not between life and death, But when I stand in front of you, Yet you dont know that I love you.";
// prefix = "f";
Scanner scanner = new Scanner(System.in);
String sentence = scanner.nextLine();
String prefix = scanner.nextLine();
System.out.println(autocomplete(sentence, prefix));
}
/**
* 根据给定的句子和前缀,提供一个自动补全的方法
* 该方法旨在从句子中提取出以给定前缀开头的单词,并按字母顺序排序后返回
* 如果没有找到以给定前缀开头的单词,则直接返回前缀本身
*
* @param sentence 完整的句子,从其中提取单词
* @param prefix 需要自动补全的前缀
* @return 自动补全后的单词列表,以空格分隔;如果没有可补全的单词,则返回前缀本身
*/
public static String autocomplete(String sentence, String prefix) {
// 提取单词
List<String> words = extractWords(sentence);
// 过滤并排序
List<String> filteredWords = filterAndSort(words, prefix);
// 输出结果
if (!filteredWords.isEmpty()) {
return String.join(" ", filteredWords);
} else {
return prefix;
}
}
/**
* 从句子中提取单词列表
* 该方法使用正则表达式来识别句子中的单词,并将其存储在列表中
*
* @param sentence 待处理的句子
* @return 包含句子中所有单词的列表
*/
private static List<String> extractWords(String sentence) {
// 使用正则表达式提取单词
Pattern pattern = Pattern.compile("\\b[A-Za-z]+\\b");
// 创建匹配器
Matcher matcher = pattern.matcher(sentence);
List<String> words = new ArrayList<>();
// 循环匹配
while (matcher.find()) {
words.add(matcher.group());
}
return words;
}
/**
* 过滤并排序字符串列表
* 该方法用于接收一个字符串列表和一个前缀字符串,过滤出以该前缀开头的字符串列表,并对其进行排序
*
* @param words 字符串列表,用于过滤和排序
* @param prefix 前缀字符串,用于确定过滤条件
* @return 返回过滤并排序后的字符串列表
*/
private static List<String> filterAndSort(List<String> words, String prefix) {
// 初始化一个新的字符串列表,用于存储过滤后的单词
List<String> filteredWords = new ArrayList<>();
// 遍历输入的字符串列表
for (String word : words) {
// 检查当前单词是否以指定的前缀开头
if (word.startsWith(prefix)) {
// 如果是,将其添加到过滤后的列表中
filteredWords.add(word);
}
}
// 对过滤后的字符串列表进行排序
filteredWords.sort(String::compareTo);
// 返回过滤并排序后的字符串列表
return filteredWords;
}
}