最短摘要的生成
題目描述:
在百度或谷歌搜索框中敲入本博客名稱的前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};
}
}
程序運行的結果如下: