1. 程式人生 > >編程之美----最短摘要的生成

編程之美----最短摘要的生成

spa 保持 設置 rac std detail 不變 詞語 clu

題意:假設給定的已經是經過網頁分詞之後的結果,詞語序列數組為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 }
View Code

參考:https://blog.csdn.net/heart_love/article/details/51576640

編程之美----最短摘要的生成