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;i3.若找到第一个关键字(即代表字串的 开头),接下来利用for(j=i+1;j4.找齐所有关键词后,此时的left指向i(字串开头),right指向j(字串结尾),判断字串的长度(j-i+1)是否长度最短,是则len=j-i+1;
5.一次找到以后fori继续遍历,直到找到最短的len。

3.代码

  1. package com.lanqiao01;
  2. import java.lang.reflect.Array;
  3. import java.util.Arrays;
  4. //给定一段产品的英文描述,包含M个英文单词,每个英文单词以空格分隔,无其他标点符号;再给定N个英文单词关键字,请说明思路并编程实现方法
  5. //
  6. //String extractSummary(String description,String[] key words)
  7. //目标是找出此产品描述中包含N个关键字(每个关键词至少出现一次)的长度最短的子串,作为产品简介输出(不限编程语言。
  8. public class 最短摘要 {
  9. public static void main(String[] args) {
  10. String s1 = "hello are you very is the picture that you do not like me";
  11. String[] key = {"are", "you", "is"};
  12. String[] s = s1.split(" ");
  13. // for (String s2 : s) {
  14. // System.out.println(s2);
  15. // }
  16. solve(s, key);
  17. }
  18. public static int indexOf(String[] arr, String word) { //返回word在数组中的下标,不存在就返回-1
  19. for (int i = 0; i < arr.length; i++) {
  20. if (arr[i].equals(word))
  21. return i;
  22. }
  23. return -1;
  24. }
  25. public static int sum(int[] arr) {
  26. int sum = 0;
  27. for (int i = 0; i < arr.length; i++) {
  28. sum += arr[i];
  29. }
  30. return sum;
  31. }
  32. public static void solve(String[] w, String[] key) {
  33. int begin = -1;
  34. int end = -1;
  35. int min = Integer.MAX_VALUE;
  36. int[] keyword = new int[key.length];
  37. for (int i = 0; i < w.length; i++) {
  38. Arrays.fill(keyword, 0);
  39. if (indexOf(key, w[i]) == -1) {
  40. continue;
  41. } else {
  42. keyword[indexOf(key, w[i])] = 1;
  43. }
  44. for (int j = i + 1; j < w.length; j++) {
  45. if (indexOf(key, w[j]) == -1 || keyword[indexOf(key, w[j])] == 1) {
  46. continue;
  47. } else {
  48. keyword[indexOf(key, w[j])] = 1;
  49. }
  50. if (sum(keyword) == keyword.length) {
  51. if ((j - i + 1) < min) {
  52. begin = i;
  53. end = j;
  54. min = j - i + 1;
  55. }
  56. }
  57. }
  58. }
  59. for (int k = begin; k <= end; k++) {
  60. System.out.print(w[k] + " ");
  61. }
  62. }
  63. }