最短摘要生成

2021-07-04 15:57:39 字數 2064 閱讀 3532

題目:抽象點說,就是在乙個字串中,找一些目標字串,找到包含所有目標字串的最小字串。題目雖然叫做最短摘要生成,但和實際的搜尋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 給出了一種比較好的解法,策略還是使用雙指標,雙指標對於很多演算法設計很有價值,演算法的思想是採用兩個指標,開始兩個指標都...