最短摘要的生成
题目描述:
在百度或谷歌搜索框中敲入本博客名称的前4个字“结构之法”,便能在第一个选项看到本博客的链接,搜索结果“结构之法算法之道-博客频道-CSDN.NET”下有一段说明性的文字:“程序员面试、算法研究、编程艺术、红黑树4大经典原创系列集锦与总结 作者:July–结构之法算法…”,我们把这段文字称为那个搜索结果的摘要,亦即最短摘要。我们的问题是,请问,这个最短摘要是怎么生成的呢?
分析与思路:
题目可知,我们的目的就是需要在一段包含关键字的数组中找到包含最短摘要的那段字符串,总共有4步:
step1,将所有关键字保存到一个map中,用来查看该关键字在段落中的位置
step2,依次比较每个关键字,标记其出现的位置,如果找到相同的关键字,则更新其下标
step3,如果找到所有关键字(保存index的个数和关键字的个数相等)计算该字符串的长度,如果比min小,就替换min的值,并将该字符串在原段落的开始和结束位置保存下来,以便最后输出、比较
step4,重复上述过程,知道原段落走完一遍为止。。。
import java.util.*;
import static java.util.Collections.sort;
public class main2 {
public static void main(String[] args) {
String keyword[] = { "微软", "计算机", "亚洲" ,"交流"};
String description[] = {
"微软", "亚洲", "研究院", "成立", "于", "1998", "年", ",", "我们", "的", "使命",
"是", "使", "未来", "的", "计算机", "能够", "看", "、", "听", "、", "学", ",",
"能", "用", "自然语言", "与", "人类", "进行", "交流", "。", "在", "此", "基础", "上",
",", "微软", "亚洲", "研究院", "还", "将", "促进", "计算机", "在", "亚太", "地区",
"的", "普及", ",", "改善", "亚太", "用户", "的", "计算", "体验", "。", "”"};
//方便查看运行结果
for (String s : keyword) {
System.out.print(s+" ");
}
System.out.println();
minText(description,keyword);
}
static void minText(String[] per,String[]keys){
Map<String,Integer> map=new HashMap();
//index中存放关键字的下标
ArrayList<Integer> index=new ArrayList();
int min=Integer.MAX_VALUE;
int start=-1;
int end=-1;
//初始化将每个关键字的值都设置为-1
for (int i = 0; i < keys.length; i++) {
map.put(keys[i],-1);
}
for (int i = 0; i < per.length; i++) {
String word=per[i];
//判断该字符串是否在map
if(map.containsKey(word)){
//如果包含该字符串,得到该字符串的下标
int k = map.get(per[i]);
//比较index看其中是否包含该下标,如果包含更新其下标,否则将该下标添加index中
if (index.contains(k))
index.remove(index.indexOf(k));
index.add(i);
//更新字符串的下标
map.put(per[i],i);
//更新完成后判断是否所有关键字被囊括其中
if(index.size()==keys.length){
//然后比较看是否是最短
int[]temp=getlength(index);
if(min>temp[0]){
min=temp[0];
//保存最短摘要的开始的下标,结束的下标
start=temp[1];
end=temp[2];
}
continue;
}
}
}
//输出找到的最短摘要
for (int i = start; i <=end; i++) {
System.out.print(per[i]);
}
}
private static int[] getlength(ArrayList<Integer>index) {
//四个关键字出现的下标顺序不一定是有序的
sort(index);
//得到开始的那个下标
int start=index.get(0);
//得到结束的那个下标
int end=index.get(index.size()-1);
return new int[]{end-start+1,start,end};
}
}
程序运行的结果如下: