1.问题描述
1.给定一段产品的英文描述,包含M个英文单词,每个英文单词以空格分隔,无其他标点符号;再给定N个英文单词关键字,请说明思路并编程实现方法String extractSummary(String description,String[] key words),目标是找出此产品描述中包含N个关键字(每个关键词至少出现一次)的长度最短的子串,作为产品简介输出。(不限编程语言)20分。
————————————————
版权声明:本文为CSDN博主「fangjian1204」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/fangjian1204/article/details/38582181
2.求包含所有query的最短距离一篇文章,切完词之后放到一个vector中,一个查询切完词也放到一个vector中,写一个函数找出这篇文章中包含这个查询中所有词的最小区间的i和j。只要返回第一个即可。
2.思路分析
1.先将给定的字符串M按照空格(” “)为划分符号划分并放入String[ ] arr数组中。
2.定义len表示字串的长度,初始设置len=Integer.MAX_VALUE。定义指针left=-1(用于指向字串的开头),right=-1(用于指向字串的结尾),第一次for(i=0;i
5.一次找到以后fori继续遍历,直到找到最短的len。
3.代码
package com.lanqiao01;
import java.lang.reflect.Array;
import java.util.Arrays;
//给定一段产品的英文描述,包含M个英文单词,每个英文单词以空格分隔,无其他标点符号;再给定N个英文单词关键字,请说明思路并编程实现方法
//
//String extractSummary(String description,String[] key words)
//目标是找出此产品描述中包含N个关键字(每个关键词至少出现一次)的长度最短的子串,作为产品简介输出(不限编程语言。
public class 最短摘要 {
public static void main(String[] args) {
String s1 = "hello are you very is the picture that you do not like me";
String[] key = {"are", "you", "is"};
String[] s = s1.split(" ");
// for (String s2 : s) {
// System.out.println(s2);
// }
solve(s, key);
}
public static int indexOf(String[] arr, String word) { //返回word在数组中的下标,不存在就返回-1
for (int i = 0; i < arr.length; i++) {
if (arr[i].equals(word))
return i;
}
return -1;
}
public static int sum(int[] arr) {
int sum = 0;
for (int i = 0; i < arr.length; i++) {
sum += arr[i];
}
return sum;
}
public static void solve(String[] w, String[] key) {
int begin = -1;
int end = -1;
int min = Integer.MAX_VALUE;
int[] keyword = new int[key.length];
for (int i = 0; i < w.length; i++) {
Arrays.fill(keyword, 0);
if (indexOf(key, w[i]) == -1) {
continue;
} else {
keyword[indexOf(key, w[i])] = 1;
}
for (int j = i + 1; j < w.length; j++) {
if (indexOf(key, w[j]) == -1 || keyword[indexOf(key, w[j])] == 1) {
continue;
} else {
keyword[indexOf(key, w[j])] = 1;
}
if (sum(keyword) == keyword.length) {
if ((j - i + 1) < min) {
begin = i;
end = j;
min = j - i + 1;
}
}
}
}
for (int k = begin; k <= end; k++) {
System.out.print(w[k] + " ");
}
}
}