题目描述:
题目:给定一段产品的英文描述,包含M个英文单词,每个单词以空格分隔,无其他标点,再给定N个英文单词关键字。请说明思路并编程实现方法 String extractSummary(String description,String [ ] Keywords):目标是找出此产品描述中包含N个关键词(每个关键词至少出现一次)的长度最短的子串,作为产品简介输出,编程语言不限。
题解:
import java.util.Arrays;
//阿里巴巴笔试题目
public class Practice_最短摘要 {
private static void solve(String[] w, String[] q) {
int begin = -1;
int end = -1;
int p2 = -1;
int minLen = Integer.MAX_VALUE;
int[] keyW = new int[q.length];
for (int i = 0; i < w.length; i++) {
Arrays.fill(keyW, 0);
String word = w[i];
int index = indexOf(q, word);
if (index == -1) {
continue;
} else {
keyW[index] = 1;
}
int j;
if (p2 != -1) {
j = p2;
} else {
j = i + 1;
}
for (; j < w.length; j++) {
String word1 = w[j];
int index1 = indexOf(q, word1);
if (index1 == -1 || keyW[index1] == 1) {
continue;
} else {//找到没有标记过的关键字
keyW[index1] = 1;//标记一下
if (sum(keyW) == q.length) {
p2 = j;
int len = j - i + 1;
if (len < minLen) {
minLen = len;
begin = i;
end = j;
}
break;
}
}
}
}
print(w, begin, end);
}
private static int sum(int[] keyW) {
int sum = 0;
for (int i = 0; i < keyW.length; i++) {
sum += keyW[i];
}
return sum;
}
private static int indexOf(String[] keyW, String word) {
for (int i = 0; i < keyW.length; i++) {
if (keyW[i].equals(word)) {
return i;
}
}
return -1;
}
private static void print(String[] w, int begin, int end) {
for (int i = begin; i <= end; i++) {
System.out.print(w[i] + " ");
}
}
public static void main(String[] args) {
String[] w = {"a", "c", "d", "a", "c", "b", "d", "e", "a", "a", "b"};
String[] q = {"b", "c", "d"};
solve(w, q);
}
}