要求找到文章最短摘要

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;
	}

}
posted @   fighterk  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示