0
点赞
收藏
分享

微信扫一扫

编程之美---最短摘要的生成

逸省 2022-03-21 阅读 71

题目背景:互联网搜索以及成为了大家工作和生活的一部分。在输入一些关键词之后,搜索引擎会返回许多结果,每个结果都包含一段概括网页内容的摘要。例如,再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;
    }


}
举报

相关推荐

0 条评论