题意:假设给定的已经是经过网页分词之后的结果,词语序列数组为W。其中W[0], W[1], ... , W[N]为一些已经分好的词语。假设用户输入的搜索关键词为数组Q。其中Q[0], Q[1], ... Q[m]为所有输入的搜索关键词。
例如,我们可以看到这样一个序列:
w0, w1, w2, w3, q0, w4, w5, q1, w6, w7, w8, q0, w9, q1
解法思路:
第一次扫描时,假设包含所有关键词,将得到如下的结果(用 a 这种形式表示指向位置)
w0, w1, w2, w3, q0, w4, w5, q1, w6, w7, w8, q0, w9, q1
保持第二个指针不变,将第一个指针指向往后移动,只要包含所有关键词,更新最小摘要序列。直到缺少一个关键词为止。
第二次扫描就成了下面的结果:
w0, w1, w2, w3, q0, w4, w5, q1, w6, w7, w8, q0, w9, q1
这样,问题就和第一次扫描时碰到的情况一样了。依次扫面下去,在 W 中找出所有包含q的序列,并且找出其中的最小值,就可得到最终的结果
代码示例如下:
1 #include <stdio.h> 2 #include<map> 3 #include<string> 4 5 using namespace std; 6 7 int main() 8 { 9 10 char keyword[][3] = {"q0", "q1"}; 11 char description[][3] = {"w0","w1","w2","w3","q0","w4","w5", 12 "q1","w6","w7","w8","q0","w9","q1"}; 13 14 int kLen = sizeof(keyword)/sizeof(keyword[0]); 15 int dLen = sizeof(description)/sizeof(description[0]); 16 int N = dLen; 17 18 int nTargetLen = N + 1; //设置目标长度为总长度加1 19 int pBegin = 0; //初始指针 20 int pEnd = 0; //结束指针 21 int nLen = N; //目标数组的长度为N 22 int nAbstractBegin = 0; //目标摘要的起始地址 23 int nAbstractEnd = 0; //目标摘要的结束地址 24 int cnt = 0; //记录出现关键词的 25 26 map<string, int> times; //记录各个关键词出现的次数 27 for(int i = 0; i < kLen; i++) 28 { 29 times[string(keyword[i])] = 0; 30 } 31 32 while(1) 33 { 34 //假设包含所有的关键词,并且后面的指针没有越界,往后移动指针 35 while(cnt != kLen && pEnd < nLen) 36 { 37 if(times.count(description[pEnd])) 38 { 39 if(times[description[pEnd]] == 0) 40 { 41 cnt++; 42 } 43 times[description[pEnd]]++; 44 } 45 pEnd++; 46 } 47 48 while(cnt == kLen) 49 { 50 if(pEnd - pBegin < nTargetLen) 51 { 52 nTargetLen = pEnd - pBegin; 53 nAbstractBegin = pBegin; 54 nAbstractEnd = pEnd - 1;//此处减一是因为45行多加了一个1 55 } 56 57 if(times.count(description[pBegin])) 58 { 59 if(--times[description[pBegin]] == 0) 60 { 61 cnt--; 62 } 63 } 64 pBegin++; 65 } 66 67 if(pEnd >= N) 68 break; 69 } 70 71 for(int i = nAbstractBegin; i <= nAbstractEnd; i++) 72 { 73 printf("%s ",description[i]); 74 } 75 return 0; 76 }
参考:https://blog.csdn.net/heart_love/article/details/51576640
原文地址:https://www.cnblogs.com/fenghualong/p/9557433.html
时间: 2024-10-12 02:38:50