最短摘要生成

2021-06-08 20:31:02 字數 2713 閱讀 2095

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

先來看看這些序列:

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

那麼,下次掃瞄應該怎麼辦呢?先把第乙個被掃瞄的位置挪到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的序列,並且找出其中的最小值,就可得到最終的結果。

為什麼設定目標長度為總長度+1?因為可能頁面從0下標開始到該頁面最後乙個下標結束才含有要找的目的串的所有字元

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;

}

解法:文獻[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)

變型題:

程式實現

#include #include using namespace std;

#define charnum 256

struct pos;

pos abstract(char a,int m,int n)

; int r[charnum]=;

int sum(0),i(0),j(0);

int min = m;

while(j1 && ij-i)

} j++;

} return p;

}int main()

{ char s="adcaccdddaacbbdabdbcdc";

int i = 0;

pos p = abstract(s,strlen(s),4);

for(i=0;i=p.s && i<=p.e)

cout<

最短摘要生成

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

最短摘要生成

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

生成最短摘要

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