《程式設計之美》 最短摘要的生成

2021-07-07 02:15:24 字數 1926 閱讀 4432

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

【解法一】

依次操作下去,一直到遍歷至目標陣列w的最後乙個位置為止。

時間複雜度是o(m*n^2)。

【解法二】

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

下次掃瞄,先把第乙個被掃瞄的位置挪到q0處

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

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

這樣,問題就和第一次掃瞄時碰到的情況一樣了。依次掃瞄下去,在w中找出所有包含q的序列,並且找出其中的最小值,就可得到最終的結果。

時間複雜度是o(m+n)。

書中**如下,

int ntargetlen = n + 1; // 設定目標長度為總長度+1  

int pbegin = 0; // 初始指標

int pend = 0; // 結束指標

int nlen = n; // 目標陣列的長度為n

int nabstractbegin = 0; // 目標摘要的起始位址

int nabstractend = 0; // 目標摘要的結束位址

while(true)

while(isallexisted())

pbegin++;

} if(pend >= n)

break;

}

全部**實現如下,

#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::map

keywords_;//儲存每個關鍵字出現的次數

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)

文章參考以下博文:

程式設計之美 最短摘要生成

本來以為這個會很難的,因為自己不是很了解這方面的東西。ok 看了程式設計之美的code後 感覺很好,類似kmp演算法,跳過已經比對過的字串,然後向後移動。思路就是 我的句子 hello are you bottom of do the is bot doke astring 程式設計之美的思路 就是...

程式設計之美 3 5最短摘要的生成

看了下 程式設計之美 這本書,記錄下3.5節的理解。1.題意是什麼?題目含義就是在已知字串s1中搜尋含有字串s2的最小字串,例如,s1 abcdemkfdc s2 cdk 則應該返回 kfdc 含有 意思是什麼?即包含即可,不需要相同順序。原書寫的有點拗口,其實對於關鍵字 微軟亞洲研究院 使命 而言...

程式設計之美 3 5 最短摘要的生成

題目 有搜尋後的網頁分詞序列 陣列w 其中w 0 w 1 w n 為分好的詞。找到w中最小的範圍w i w j 讓其包括所有的q。思路 最想當然的思路就是從w 0 開始,對每個q遍歷判斷有沒有一樣的,截取出第乙個包含q中元素的w i 到最後乙個包括q中元素的w j 需要o mn 次比較。如果前提能夠...