糖果;及子串查詢分析

紫鳳發表於2013-10-21

今日面試題:糖果

N個孩子站成一排,每個人分給一個權重。按照如下的規則分配糖果:

1. 每個孩子至少有一個糖果

2. 所分配權重較高的孩子,會比他的鄰居獲得更多的糖果

問題是,最少需要多少個糖果?

==================================================

子串查詢分析

原題

從一個長字串中查詢包含給定字符集合的最短子串。例如,長串為“aaaaaaaaaacbebbbbbdddddddcccccc”,字符集為 {abcd},那麼最短子串是“acbebbbbbd”。如果將條件改為“包含且只包含給定字符集合”,你的演算法和實現又將如何改動。

分析

本期的題目與上期的題目頗類似。上期我們在分析完之後,提到還可以利用hashmap來實現。這樣可以進一步的減小時間複雜度。具體的思路與上期的方法也類似,只是在判斷是否出現的時候,不是採用排序的方法,而是hashmap的方法。具體方法如下:

1. 遍歷一邊字符集合,將集合中的字元都加到hashmap中

2. 然後遍歷長串,記錄遍歷開始pBegin和結束pEnd的位置,直到hashmap中的字元都出現過,則不斷移動pBegin,檢視是否能夠滿足 所有字符集和中的字元都出現了,如果出現:則不斷更新最小長度;如果沒有出現,則停止移動pBegin,開始移動pEnd。依次類推,像一個可以伸縮的窗 口在長串上遍歷。

示例程式碼如下:

enter image description here

這個程式碼是《程式設計之美》中求解最短摘要的程式碼,其實本題,也是最短摘要的一個變化,字符集和就相當於查詢了。

這裡有一個小小的技巧,在移動pBegin的時候,怎麼判斷是否字符集合中的字元都出現了呢?可以採用給另外一個hashmap用來記錄字符集中字 符出現的次數,當pBegin指向的字元,出現在hashmap中,則其對應出現次數減1,如果次數為0了,則要停止pBegin,開始移動pEnd。

這個方法的時間複雜度為O(2*n + m),空間複雜度為O(n)。

【分析完畢】

本文來自微信:待字閨中,2013-10-04釋出,原創@陳利人 ,歡迎大家繼續關注微信公眾賬號“待字閨中”。

相關文章