程式設計之美之最短摘要生成
書上給出了最短摘要的描述即演算法,簡單來說就是:
掃描過程始終保持一個[pBegin,pEnd]的range,初始化確保[pBegin,pEnd]的range裡包含所有關鍵字 。然後每次迭代,嘗試調整pBegin和pEnd:
1.pBegin遞增,直到range無法包含所有關鍵字
2.pEnd遞增,直到range重新包含所有關鍵字
計算新的range,與舊的range相比,看是否縮短了,如果是,則更新 不考慮關鍵字的先後順序 。這裡給出最短摘要演算法的幾個應用,首先是leetcode上面的兩題:
Minimum Window Substring
Given a string S and a string T, find the minimum window in S which will contain all the characters in T in complexity O(n).
For example,
S = "ADOBECODEBANC"
T = "ABC"
Minimum window is "BANC"
.
Note:
If there is no such window in S that covers all characters in T, return the emtpy string ""
.
If there are multiple such windows, you are guaranteed that there will always be only one unique minimum window in S.
思路:和最短摘要類似,只是程式設計之美中沒有給出具體的實現。這裡使用了兩個陣列,一個是摘要的字元的個數,一個是當前找到的摘要的個數。當找到完整的摘要時,就開始移動視窗左端的指標,演算法和程式設計之美中的一樣
class Solution {
public:
string minWindow(string S, string T) {
int needChar[256] = {0},findChar[256] = {0},i,sLen = S.size(),tLen = T.size();
for(i = 0; i < tLen; ++i) ++needChar[T[i]];
int begin = 0 , end = 0 , minWindowSize = INT_MAX , windowLeft = 0,windowRight = 0 , count = 0;
for(; end < sLen ;++end )
{
if(needChar[S[end]] == 0)continue;
if(++findChar[S[end]] <= needChar[S[end]])++count;
if(count == tLen)//找到一個完整的摘要
{
while(begin <= end)
{
if(needChar[S[begin]] == 0)
{
++begin;
continue;
}
if(findChar[S[begin]] > needChar[S[begin]])//儘可能的移動視窗的左指標
{
--findChar[S[begin++]];
continue;
}
else break;//此時,左視窗指標已不能移動
}
if(end - begin + 1 < minWindowSize)//更新當前視窗的大小
{
minWindowSize = end - begin + 1;
windowLeft = begin;
}
}
}
if(minWindowSize == INT_MAX)return "";
return S.substr(windowLeft,minWindowSize);
}
};
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int start = 0 , end = 0 , maxLength = 0;
int pos[256] = {0};
for(;end < s.size();++end)
{
if(pos[s[end]] > start)start = pos[s[end]];//即s[end]在前面已經出現錯,為了沒有重複,start指向上次s[end]出現的下一個位置
if(end - start + 1 > maxLength)maxLength = end - start + 1;
pos[s[end]] = end + 1;//記錄s[end]出現的下一個位置
}
return maxLength;
}
};
筆試題:
1、阿里巴巴2011年
給定一段產品的英文描述,包含M個英文字母,每個英文單詞以空格分隔,無其他標點符號;再給定N個英文單詞關鍵字,請說明思路並程式設計實現方法String extractSummary(String description,String[] key words),目標是找出此產品描述中包含N個關鍵字(每個關鍵詞至少出現一次)的長度最短的子串,作為產品簡介輸出。(不限程式語言)20分。
2、人人面試題
求包含所有query的最短距離
一篇文章,切完詞之後放到一個vector<string>中,一個查詢切完詞也放到一個vector<string>中,寫一個函式找出這篇文章中包含這個查詢中所有詞的最小區間的i和j。只要返回第一個即可。
相關文章
- 程式設計之美之買票找零程式設計
- 程式設計之美複習筆記程式設計筆記
- 程式設計之美之高效安排見面會程式設計
- 程式設計之美leetcode之編輯距離程式設計LeetCode
- Go併發程式設計之美-CAS操作Go程式設計
- Go併發程式設計之美-互斥鎖Go程式設計
- java程式設計之:生成rsa金鑰Java程式設計
- 程式碼之美---遞迴之美遞迴
- 程式設計之美初賽第一場--焦距程式設計
- 程式設計之美初賽第一場--樹程式設計
- 演算法字串位包含程式設計之美演算法字串程式設計
- [程式設計之美][2.2] 不要被階乘嚇倒程式設計
- 程式設計之美之電話號碼對應英語單詞程式設計
- 品味Spring Cache設計之美Spring
- 重新領略設計模式之美設計模式
- 程式設計師快樂器之JAVA程式碼生成工具程式設計師Java
- c++ 泛型程式設計 之 自動生成程式碼C++泛型程式設計
- 程式碼之美_感悟
- 《程式碼之美》 ——序
- 享受程式碼之美
- Java併發程式設計之美-千無萬喚使出來Java程式設計
- 微軟2程式設計之美2015資格賽微軟程式設計
- 《程式設計之美》舞動’08年IT圖書銷售奇蹟程式設計
- 第五章 字串專題 ---------------- 5.11 題解:最短摘要的生成字串
- 同時找到最大值和最小值——程式設計之美程式設計
- [程式設計之美][3.10] 分層遍歷二叉樹程式設計二叉樹
- 程式設計之美:螞蟻爬杆問題的擴充套件程式設計套件
- 2013程式設計之美全國挑戰賽資格賽之傳話遊戲薦程式設計遊戲
- 《程式碼之美》的故事
- 細細品讀Retrofit的設計之美一
- 品味布隆過濾器的設計之美過濾器
- 細細品讀Retrofit的設計之美二
- 美圖秀秀-美化圖片之【特效】介面設計特效
- 簡約之美:如何實現簡約設計
- 最短路之Dijkstra
- 求二進位制數中1的個數(程式設計之美)程式設計
- Python之美[從菜鳥到高手]--生成器之全景分析Python
- Linux 程式設計之Shell程式設計(轉)Linux程式設計