子串查詢;及排列子串分析

紫鳳發表於2013-10-16

今日面試題:子串查

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

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

排列子串分析

原題

給定兩個字串A和B,判斷A中是否包含由B中字元重新排列成的新字串。例如:A=abcdef, B=ba,結果應該返回true。因為ba的排列ab,是A的子串。

分析我們假設A字串的長度為m,B字串的長度為n。首先,如果B的長度大於A了,則肯定返回的是false。所以,我們下面的討論都是m>=n的情況。

最直接的,我們可以計算出B的所有排列字串,然後逐個去A中匹配。B的所有排列字串有n!個,每一個匹配,複雜度較高。

那麼如何改進呢?是否可以減少匹配的次數呢?我們首先對B進行排序,採用快排,時間複雜度O(nlogn),得到D。然後在A中,從頭開始,長度為 n的子串進C行排序,然後判斷與C與D是否相同。在A中,一共有m-n+1個長度為n的子串,每一個子串進行排序,時間複雜度為O(nlogn),總的時 間複雜度為O((m-n+1)nlogn),O(mnlogn)。但其實,在A中,只有第一個C的排序時O(nlogn)的,其他的都是去掉第一個字元, 然後插入下一個字元,排序時間複雜度為O(n),這樣整體的時間複雜度為O(mn)。下面舉個例子: 設定A=fedcba, B=ab,則m=6,n=2

1. 排序B,D=ab

2. 在A中,第一個長度為2的子串C=fe,排序之後為ef,與D不匹配,則從C中刪除第一個字元f,加入下一個字元c,此時C=ec。再重複排序的過程。直到A遍歷完畢。

明顯第一個C需要快排,其他的只需要插入即可。

還有其他的方法,可以用hashmap儲存B中的字元,和A中的每一個長度為n的字串進行判斷是否匹配。

【分析完畢】

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

相關文章