思路:定义一个getA方法用于返回一个字符串res,res为每个单词的小写字母,因为一个res可能对应多句词典里的话,所以用hashmap来存储,键值对分别为String类型的res以及list集合用于存储res对应字典里的句子,在存储过程中用到了一个computeIfAbsent()方法,
map.computeIfAbsent(res, k -> new ArrayList<>()).add(s);解释:第一个参数,map如果存在res,括号里返回的就是res对应的list,如果不存在就创建一个新的list k(k是list的变量名,但是没有用到这个变量名所以是灰色的),不管哪个情况都add需要加入的句子。·
之后q次询问,如果map里存在这个getA(这个句子),就获得对应的list并进行排序,然后输出,不存在就输出原句即可。
补充:这里map的值我用的是list而没有用set是因为那个字典里的句子可以重复,比如在yyds的字典里可以有两句yu yu du su,两句都要输出,卡的是测试点7
import java.io.*;
import java.util.*;
public class Main {
static BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
public static void main(String[] args) throws IOException {
int n = Integer.parseInt(bf.readLine());
String[] ss = new String[n];
for (int i = 0; i < n; i++) {
ss[i] = bf.readLine();
}
HashMap<String, List<String>> map = new HashMap<>();
for (String s : ss) {
String res = getA(s);
map.computeIfAbsent(res, k -> new ArrayList<>()).add(s);
}
int q = Integer.parseInt(bf.readLine());
while (q-->0){
String str = bf.readLine();
String temp = getA(str);
if (map.containsKey(temp)){
List<String> list = map.get(temp);
StringBuilder ans = new StringBuilder();
list.sort(null);
for(String s : list){
ans.append(s).append("|");
}
ans.delete(ans.length()-1,ans.length());//删除多的|
out.println(ans);
}else {
out.println(str);
}
}
out.flush();
}
static String getA(String str){
String[] strs = str.split(" ");
StringBuilder res = new StringBuilder();
for (String s : strs) {
if (s.isEmpty())
continue;
res.append(s.charAt(0));
}
return res.toString();
}
}
感谢支持,点个关注一起学习~