其中查找主要思想与KMP算法思想比较相近,其中对于英文摘要,因为每一个英文字符对应一个ASCLL码,所以可以利用博客“http://blog.youkuaiyun.com/hiphopmattshi/article/details/8026722”的思想,定义一个数组来进行匹配。而对于中文摘要,因为中文字没有对应的ASCLL码,所以可以定义数组形指针来分别匹配,但是这里的复杂度相对前者要大,而空间复杂度要小。具体代码如下:
#include "stdio.h"
#include "string.h"
#include "assert.h"
#define MAX 1024
/*利用如下对应的代码只能处理英文摘要,而对于中文字其对应的ASCL码不确定*/
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++)
{
/*强制将str中对应的英文字母转换为数字,使其作为hash数组的下标*/
hash[str[i]]=1;
}
for(i=0;i<lenK;i++)
{ /*参考原数组中是否包含需要查找的字符,如果没有退出循环*/
if(hash[key[i]]==0)
break;
}
if(i == lenK )//表示找到对应的字符串,对ret赋值
ret =1;
return ret;
}
/*处理对应的中文摘要,利用数组指针来处理*/
int isMatchAll0(char *src[],int start,int end ,char *des[],int deslen)
{
int i,j;
int isFind;
for(j=0;j < deslen;++j)
{
isFind = 0;
for(i = start;i < end;i++)
{ /*对src[i]与des[j]中的字符数组进行匹配,如果src[i]中含有des[j]中的字符时,返回第一个匹配的位置*/
if(strstr(src[i],des[j])!=NULL)
isFind = 1;
}
if(isFind == 0)
{
return 0;
}
}
return 1;
}
void find(const char *str[],int lenS,const char *key[],int lenK)
{
int begin = 0;
int end = 0;
int minLength = 0x7FFFFFFF;
int mstart = 0;
int mend =0;
assert(str&&key);
for(;;)
{ /*假设未包含所有的关键词,并且后面的指针没有越界,往后移动指针*/
while(!isMatchAll0(str,begin,end,key,lenK)&&end<lenS)
{
end++;
}
/*假设找到一段包含所有关键词信息的字符串*/
while(isMatchAll0(str,begin,end,key,lenK))
{
if(end-begin+1 <minLength)
{
minLength = end-begin+1;
mstart =begin;
mend =end;
}
begin++;
}
if(end>=lenS-1)
break;
}
printf("%d\n",minLength);
for(;mstart<mend;mstart++)
printf("%s ",str[mstart]);
}
int main()
{
char *str[]={"微软","亚洲","研究院","成立","于","1998","年","我们","的","使命","是",
"使","未来","的","计算机","能够","看","、","听","、"};
char *key[]={"微软","亚洲","研究院","使命"};
int m=sizeof(str)/(sizeof(str[1]));
int n=sizeof(key)/(sizeof(key[1]));
find(str,m,key,n);
system("pause");
return 0;
}