**
題目:抽象點說,就是在乙個字串中,找一些目標字串,找到包含所有目標字串的最小字串。題目雖然叫做最短摘要生成,但和實際的搜尋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...
生成最短摘要
如下 演算法思想 從頭掃瞄輸入字串,找到第乙個在關鍵字中出現的單詞 記錄其偏移量,繼續往後掃瞄得到出現在關鍵字中的第二個單詞 可以 和第乙個相同 一直到此子串包含所有的關鍵字,此時也需要記錄 其偏移量,計算其大小 接下來繼續從以上子串中的第二個被找到的關鍵字 開始掃瞄.一直到結束,最後選出距離最小的...