编程之美最短摘要生成

本来以为这个会很难的,因为自己不是很了解这方面的东西。

看了下解释 大致明白了,就是用最少的句子 ,包含所有的关键词。

ok~看了编程之美的code后 感觉很好,类似kmp算法,跳过已经比对过的字符串,然后向后移动。

曾经做过一个单调队列的,就是一个数组,移动滑动窗口,判断窗口里面的最大值最小值


思路就是

比如 我的关键词为 abde

我的句子  hello  are  you bottom of do the is bot doke astring.

在一个句子里面找到包含关键词的 最短的句子。当然 关键词可以无序排列。

编程之美的思路 就是

设置一个begin 一个end 起初都指向句子头

end向后移动一直到包含所有关键词 停止。

记录长度,同时移动begin,直至不包含某关键词后,再次移动end,直至包含。

总结来说  就是 一遍获得所有结果。不回溯

#include "stdio.h"
#include "string.h"
#include "assert.h"
#define MAX 1024
int isMatchAll(const char *str,const char *key,int begin,int end)
{
	int ret =0;
	char hash[256];
	int i =0;
	int lenK = strlen(key);
	memset(hash,0,sizeof(hash));
	for(i=begin;i<=end;i++)
	{
		hash[str[i]]=1;
	}
	for(i=0;i<lenK;i++)
	{
		if(hash[key[i]]==0)
			break;	
	}
	if(i == lenK )
		ret =1;
		
	return ret;
}
void find(const char *str,const char *key)
{

	int lenS = strlen(str);
	int lenK = strlen(key);
	
	int begin = 0;
	int end = 0;
	int minLength = 0x7FFFFFFF;
	int mstart = 0;
	int mend =0;
	assert(str&&key);
	for(;;)
	{
		while(!isMatchAll(str,key,begin,end)&&end<lenS)
		{
			end++;		
		}
		while(isMatchAll(str,key,begin,end))
		{
			if(end-begin+1 <minLength)
			{
				minLength = end-begin+1;
				mstart =begin;
				mend =end;
			}
			begin++;
		}
		if(end>=lenS)
			break;
	}
	printf("%d\n",minLength);
	for(;mstart<=mend;mstart++)
		printf("%c",str[mstart]);
}


int main()
{
	char str[MAX];
	char key[MAX];
	
	gets(str);
	gets(key);
	find(str,key);
	return 0;

}




  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值