package demo;
public class P79 {
//要求找到文章最短摘要,就是包含所有关键词的最短语句
//思路:尺取法。 i指向当下第一个关键词,j指向使得集齐的最后一个关键词。
//
public static void main(String[] args) {
String[] strArr1= {
"i",
"am",
"a",
"hungry",
"hungry",
"tired",
"student"
};
String[] strArr2= {
"a",
"hungry",
"tired"
};
findKeys(strArr1, strArr2);
}
static void findKeys(String[] words,String[] keys) {
int minLen=Integer.MAX_VALUE;
int begin=-1; int end=-1; //记录最终结果的开头、结尾
int p2=-1; //暂存上次的j、记录找到关键词的情况
int[] keyFound=new int[keys.length];
for(int i=0;i<words.length;i++) {
for(int k=0;k<keyFound.length;k++) { //清空keyFound
keyFound[k]=0;
}
int index1=indexOf(keys,words[i]); //等于第index1个关键词,否则返回-1
if(index1==-1) {
continue;
}
else {
keyFound[index1]=1;
}
int j;
if(p2!=-1)
j=p2; //j从之前的位置继续
else
j=i+1;
for(;j<words.length;j++) {
int index2=indexOf(keys, words[j]);
if(index2==-1 || keyFound[index2]==1) {
continue;
}
else {
keyFound[index2]=1;
if(sum(keyFound)==keys.length) { //关键词集齐了
p2=j;
if(j-i+1<minLen) { //和历史最短摘要比较
begin=i;
end=j;
minLen=end-begin+1;
}
break;
}
}
}
}
for(int k=begin;k<=end;k++) { //输出摘要结果
System.out.println(words[k]);
}
}
static int sum(int[] keyFound) {
int sum=0;
for(int i:keyFound) {
sum+=i;
}
return sum;
}
private static int indexOf(String[] keys, String word) {
int index=-1;
for(int i=0; i<keys.length; i++) {
if(word.equals(keys[i])) {
index=i;
break;
}
}
return index;
}
}