最短摘要生成

2021-06-14 09:57:18 字數 2154 閱讀 4685

**

題目:抽象點說,就是在乙個字串中,找一些目標字串,找到包含所有目標字串的最小字串。題目雖然叫做最短摘要生成,但和實際的搜尋snippet的計算還是有比較大的差距的。

解法:文獻[1]給出了一種比較好的解法,策略還是使用雙指標,雙指標對於很多演算法設計很有價值,演算法的思想是採用兩個指標,開始兩個指標都指向緩衝區的頭部,尾指標向後掃瞄,直到頭指標和尾指標中間包含了全部的關鍵字,那麼頭指標向後移動,直到包含全部關鍵字這個條件失敗,這時擷取字串並和已取得的最小字串比較,如果小則替換。頭指標、尾指標都向後乙個位置(這點很重要,開始就忘記了移動頭指標,導致程式出錯),繼續掃瞄。另外,由於乙個關鍵字可能重複多次,因此在判斷是否包含全部關鍵字時要採用計數機制,才能保證檢視的準確。這樣只要頭指標和尾指標掃瞄兩次字串就可以完成生成演算法。

#include #include #include class keywordchecker 

void addkeyword(const std::string& word)

} bool iscontainallkeyword(const std::string& word, bool add)

if (add) else

std::map::iterator begin = keywords_.begin();

int counter = 0;

while (begin != keywords_.end()) else

begin++;

}if (counter == keywords_.size()) else

} private:

std::mapkeywords_;

bool current_state_;

};std::string generatesnippet(const std::string& content, keywordchecker* keyword_checker)

while (begin <= end && keyword_checker->iscontainallkeyword(std::string(1, content[begin]), false))

if (end - begin + 1 < min_length)

end++;

begin++;

} return snippet;

}int main(int argc, char** argv)

另外乙個****

題目:alibaba筆試題:給定一段產品的英文描述,包含m個英文本母,每個英文單詞以空格分隔,無其他標點符號;

再給定n個英文單詞關鍵 字,請說明思路並程式設計實現方法string extractsummary(string description,string key words),

先來看看這些序列:

w0,w1,w2,w3,q0,w4,w5,q1,w6,w7,w8,q0,w9,q1

分析

當初看這道題時,看了好了幾遍都沒看懂。後來總算弄明白:給出的字串是用其它程式分好詞的,關鍵字串也是用其它程式分好詞的,而不是按使用者直接輸入的字串。比如書上給的例子:「微軟亞洲研究院

「最短摘要」應該是指:包含所有關鍵字(關鍵字不要求按使用者輸入的順序排列)的長度最短的摘要。書上的解法,把「最短摘要」理解成包含所有關鍵字且詞個數最少的摘要。

總結的滑動視窗法是:

使用滑動視窗的辦法,找出最短摘要。我們把這個滑動視窗叫做摘要滑動視窗

摘要滑動視窗左邊界l,右邊界r。

視窗中應該維護的資訊:

視窗中已經遍歷過的關鍵字序列----可使用佇列才儲存;

視窗中各個關鍵字出現的個數----可使用hashtable來表示或者陣列也行。

[while]

右邊界r向右移動的原則:

當前視窗中不包含所有種類的關鍵字,r向右移動尋找更新的關鍵字。

左邊界l向右移動的原則:

當前視窗中已經包含了所有種類的關鍵字,計算當前摘要長度,並從佇列中拿出乙個關鍵字,即l向右移動乙個關鍵字;

l與r一直移動下去,一直到r不能往右移動時候,迴圈結束。

[end while]

最短摘要生成

問題定義 給定乙個字串str,以及乙個關鍵字字串陣列key,求str中包含key中所有字串的最短子串。基本方法 雙指標掃瞄字串 詳細演算法 1.使用start和end兩個整數來指示掃瞄位置。均初始化為0。2.對end加1,直到str start,end 中包含所有關鍵字,或者end strlen s...

最短摘要生成

題目 抽象點說,就是在乙個字串中,找一些目標字串,找到包含所有目標字串的最小字串。題目雖然叫做最短摘要生成,但和實際的搜尋snippet的計算還是有比較大的差距的。先來看看這些序列 w0,w1,w2,w3,q0,w4,w5,q1,w6,w7,w8,q0,w9,q1 w0,w1,w2,w3,q0,w4...

生成最短摘要

如下 演算法思想 從頭掃瞄輸入字串,找到第乙個在關鍵字中出現的單詞 記錄其偏移量,繼續往後掃瞄得到出現在關鍵字中的第二個單詞 可以 和第乙個相同 一直到此子串包含所有的關鍵字,此時也需要記錄 其偏移量,計算其大小 接下來繼續從以上子串中的第二個被找到的關鍵字 開始掃瞄.一直到結束,最後選出距離最小的...