题目背景:互联网搜索以及成为了大家工作和生活的一部分。在输入一些关键词之后,搜索引擎会返回许多结果,每个结果都包含一段概括网页内容的摘要。例如,再www.live.com中搜索“微软亚洲研究院 使命“,第一个结果是微软亚洲研究院的首页,如图 3-7所示。
再搜索结果中,标题和URL之间的内容就是我们所说的摘要:
假设给定的已经是经过网页分词之后的结果,词语序列数组为W。其中W[0],W[1]....W[N]为一些已经分好的词语。
假设用户输入的搜索关键词为数组Q。其中Q[0],Q[1].....Q[m]为所有输入人的搜索关键词。
这样,生成的最短摘要实际上就是一串相互联系的分词序列。比如从W[i]到W[j],其中,0<i<j<=N。例如图 3-7 中,“欢迎光临微软亚洲研究院首页”包含了所有的关键字------"微软亚洲研究院 使命"。
题目:给定一段产品的英文描述,包含M个英文字母,每个英文单词一空格分隔,无其他标点符号;再给定N个英文单词关键字,请说明思路并编程实现方法
目标是找出此参评描述中包含N个关键字(每个关键词至少出现一次)的长度最短的字串,作为产品简介输出。
用俩个游标记录满足关键字的下标如果不满足j++,满足时j停下i++顺便移除前面的关键字,当i找到关键字时 发现不满足所有关键字都找到j再次进行前进
import javax.sound.sampled.EnumControl;
import java.sql.Array;
import java.util.*;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String strA = input.nextLine();
String strB = input.nextLine();
String[] strsB = strB.split("\\s");
minDigest(strA,strsB);
}
static Set<String> pdSet = new HashSet<>();
static Map<String,Integer> mapSubstring = new HashMap<>();
static Map<String,Integer> map = new HashMap<>();
public static void minDigest(String strA,String[] strB){
initSubstring(strB);
String[] strs = strA.split("\\s");
int n = strs.length;
int i = 0,j = 0,min = Integer.MAX_VALUE;
int start = -1,end = -1;
boolean flag = true;
while(i<n && j<n){
if(pdSet.contains(strs[i])){
if(j<i){
j = i;
}
if(flag && pdSet.contains(strs[j])){
map.put(strs[j],map.getOrDefault(strs[j],0)+1);
}
if(check()){
if(min > j-i+1){
min = j-i+1;
start = i;
end = j;
}
// System.out.println(i+" "+j);
// System.out.println(map);
Integer num = map.get(strs[i]);
if(num-1<=0){
map.remove(strs[i]);
}
else{
num--;
map.put(strs[i],num);
}
i++;
flag = false;
}
else {
j++;
flag = true;
}
}
else i++;
}
if(start == -1 || end == -1){
System.out.println("-1");
return;
}
for(int k = start;k<=end;k++){
System.out.print(strs[k]+" ");
}
}
public static void initSubstring(String[] strB){
int n = strB.length;
for(int i =0;i<n;i++){
pdSet.add(strB[i]);
mapSubstring.put(strB[i],map.getOrDefault(strB[i],0)+1);
}
}
public static boolean check(){
for(var temp : mapSubstring.entrySet()){
if(!map.containsKey(temp.getKey())){
return false;
}
if(map.get(temp.getKey())< temp.getValue()){
return false;
}
}
return true;
}
}