算法很美中讲的方法存在一定问题
对于已经查找到的范围缩减范围后存在更小区间的情况没有被考虑进去 个人认为原因出在辅助数组直接全部清0这个地方 中间已经找到的元素被全部置0导致后面搜索时需要继续向后端遍历
仅仅代表个人愚见 欢迎各位大神指正!
代码如下:
package 最短摘要;
import java.util.Arrays;
/*
*
* 给定一段产品的英文描述,包含M个英文单词,每个英文单词以空格分隔,无其他标点符号;
在给定N个英文关键字,请说明思路并编程实现方法
*
* */
public class Main {
public static void main(String[] args) {
String[] s = new String[]{"d","b","b","a","c","s","d","a","t"};
String[] keyWords = new String[] {"a","b","c"};
extract(s, keyWords);
}
public static void extract(String[] s,String[] keyWords) {
int sLength = s.length;//原字符串数组长度
int kLength = keyWords.length;//搜索字符串数组长度
int begin = -1;//用于记录开始位置字符串
int end = -1;//用于记录结束位置字符串
int p2 = -1;//p2用于保存每一次所保留的范围中j的位置
int[] keyFound = new int[kLength];//建立一个辅助数组,长度等于搜索字符串长度,用于记录该字符串是否已经被搜索到。
int minlength = sLength + 1;
for (int i = 0; i < sLength; i++) {
//Arrays.fill(keyFound, 0);
String word = s[i];//当前i位置的字符串
int index = containsOf(keyWords, word);
if(index == -1) {//判断该字符串是否在搜索字符串数组中
continue;
}else {
keyFound[index] = 1;//将辅助数组中对应的搜索字符位置处置1作为标记
}
int j;
if(p2 == -1) {
j = i + 1;
}else {
j = p2;
}
for (; j < sLength; j++) {
String word1 = s[j];//当前i位置的字符串
int index1 = containsOf(keyWords, word1);
if(index1 == -1 || keyFound[index1] == 1) {//判断该字符串是否在搜索字符串数组中
continue;
}else {
keyFound[index1] = 1;//将辅助数组中对应的搜索字符位置处置1作为标记
}
if(sum(keyFound) == keyFound.length) {//找齐了所有元素
System.out.println("探测尝试:"+i+" "+j);
p2 = j;//保存探测到的右边界
if(j - i + 1 < minlength) {
begin = i;
end = j;
minlength = j - i + 1;
keyFound[index] = 0;//这里要考虑对于左边界缩小 右边界不动的情况 如果中间存在其他已经搜索到的元素 那么他们不需要被置0
keyFound[index1] = 0;
}
break;
}
}
}
System.out.println("最终结果起点下标为:"+begin +" 下标终点为:"+ end);
}
//检索搜索字符串数组中是否包含该str字符串,包含则返回该字符串在搜索字符串的下标
public static int containsOf(String[] keyWords ,String str ) {
for (int i = 0; i < keyWords.length; i++) {
if(keyWords[i].equals(str))
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;
}
}