最短摘要生成算法
int FindAbstract(vector<string>&sent,vector<string> &keys,vector<string> &rst)
{map<string,int> keyMp;set<string> keySt;int beg = 0,end = 0,s = 0,t = 0,MinLen = 0x7fffffff;queue<int> pos;//將所有關鍵詞的下標放入隊列中,當關鍵詞的種類全時,就要從最開始的下標開始遍歷for(int i=0;i<keys.size();++i)keySt.insert(keys[i]);for (;end<sent.size();++end){if (keySt.find(sent[end])!=keySt.end()){keyMp[sent[end]] +=1;pos.push(end);while (keyMp.size() == keys.size()){beg = pos.front();pos.pop();keyMp[sent[beg]] -=1;if(keyMp[sent[beg]] == 0)keyMp.erase(sent[beg]);int span = end - beg +1;if (span < MinLen){MinLen = span;s = beg;t = end;}}}}for (int i=s;i<=t;++i)rst.push_back(sent[i]);return MinLen;
}
int main()
{string strarr[] = {"d","b","e","c","a","b","e","a","e","b","d"};vector<string> cnt;for(int i=0;i<11;++i)cnt.push_back(strarr[i]);vector<string> keys;keys.push_back("a");keys.push_back("d");keys.push_back("e");vector<string> rst;cout<<FindAbstract(cnt,keys,rst)<<endl;for(int i=0;i<rst.size();++i)cout<<rst[i]<<" ";return 0;
}
總結