題目:抽象點說,就是在乙個字串中,找一些目標字串,找到包含所有目標字串的最小字串。題目雖然叫做最短摘要生成,但和實際的搜尋snippet的計算還是有比較大的差距的。
解法:程式設計之美3.5給出了一種比較好的解法,策略還是使用雙指標,雙指標對於很多演算法設計很有價值,演算法的思想是採用兩個指標,開始兩個指標都指向緩衝區的頭部,尾指標向後掃瞄,直到頭指標和尾指標中間包含了全部的關鍵字,那麼頭指標向後移動,直到包含全部關鍵字這個條件失敗,這時擷取字串並和已取得的最小字串比較,如果小則替換。頭指標、尾指標都向後乙個位置(這點很重要,開始就忘記了移動頭指標,導致程式出錯),繼續掃瞄。另外,由於乙個關鍵字可能重複多次,因此在判斷是否包含全部關鍵字時要採用計數機制,才能保證檢視的準確。這樣只要頭指標和尾指標掃瞄兩次字串就可以完成生成演算法。
#include #include #include class keywordchecker
// 新增keyword
void addkeyword(const std::string& word)
} // 檢視當前(begin,end)字串是否包含所有keyword
bool iscontainallkeyword(const std::string& word, bool add)
if (add) else
// 獲得keyword迭代器,遍歷檢視當前(begin,end)字串中包含的keyword個數
std::map::iterator it = keywords_.begin();
int counter = 0;
while (it != keywords_.end()) else
it++;
}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)
1. 題幹大意如下:輸入兩個字串,乙個表示使用者輸入的查詢,另乙個表示一篇文件的內容。對於查詢和文件分別進行自動分詞後,使用者查詢和文件內容的兩個字串變為兩個詞語序列。比如,下面的keyword表示分詞後的使用者查詢,str表示分詞後的文件內容。
string keyword = ;
string str = ;
所要求得是str1中的若干個連續的字串,假設為str[i]-str[j],其中包含keyword中的所有詞語,且str[i]-str[j]是滿足這個條件的最短的乙個。
2. 思路
3. **實現
#include#include#include#includeusing namespace std;
void find_min_len_abstract(string str, string keyword, int len_str, int len_keyword) {
// 初始化map
maprecord;
for(int i=0; i
輸出結果如下:
最短摘要生成
問題定義 給定乙個字串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...
最短摘要生成
題目 抽象點說,就是在乙個字串中,找一些目標字串,找到包含所有目標字串的最小字串。題目雖然叫做最短摘要生成,但和實際的搜尋snippet的計算還是有比較大的差距的。解法 文獻 1 給出了一種比較好的解法,策略還是使用雙指標,雙指標對於很多演算法設計很有價值,演算法的思想是採用兩個指標,開始兩個指標都...