刪除字元;及interleave字串分析

紫鳳發表於2013-09-26

今日面試題:刪除字元

刪除字串中的“b”和“ac”,需要滿足如下的條件:

1. 字串只能遍歷一次

2. 不能夠實用額外的空間

例如:

1. acbac   ==>  ""

2. aaac    ==>  aa

3. ababac  ==>   aa

4. bbbbd   ==>   d

進一步思考:如何處理aaccac呢,需要做哪些改變呢?

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

interleave字串分析

原題

3個字串a,b,c。判斷c是否是a和b的interleave,也就是c中應該有a,b中所有字 符,並且c中字元順序和a,b中一樣。比如,

1. a = "ef" b = "gh" c = "egfh" return true;

2. a = "ef" b = "gh" c = "ehgf" return false。

分析

這個題目中,並沒有說明a和b中是否有相同的字元,這個直接影響了最終的解法。所以,大家在面試的過程中,要和麵試官進行互動,弄清楚之後再動手。我們這裡對於是否有相同的字元都給予分析。希望對大家有所幫助。

a和b沒有相同字元的情況

這個情況處理起來比較簡單,逐個字元遍歷c字串,首先處理第一個字元,將其與a中的字元匹配,如果沒有匹配,則與b中的字元逐個匹配,如果沒有匹 配,則返回false;如果a中或者b中有一個字元和c的第一個字元匹配上了,則如上考慮第二個字元,與c的第一個字元匹配上的字串,也考慮第二個字 符,依次類推。直到c遍歷完,這時,如果a和b還有字元沒有遍歷,也返回false,都遍歷完畢,返回true。程式碼如下:

enter image description here

上面演算法的時間複雜度是多少呢?我們只需要考慮a和b的遍歷情況,要麼a++,要麼b++,所以演算法的時間複雜度為O(m+n),m和n分別為a和b的長度。a和b這兩個字串,各自遍歷一遍即可。

a和b有相同字元的情況

上面的演算法,不能夠處理a和b中有相同字元的情況,例如a="XXY",b="XXZ",c="XXZXXY"。如果要處理,有相同字元的情況也是 比較直接的。有相同的出現,如果都匹配了c中的字元,則兩種匹配分別都考慮,只要有一個返回true,整個演算法就返回true。

enter image description here

注意後面是||,兩種情況都要考慮的。

上面這個演算法的時間複雜度,在最壞的情況下是指數級的。所以,下面介紹一個動態規劃的解法。一個問題能夠用動態規劃來解的一個前提是:要有重複的子 問題。這樣把子問題的解儲存起來,後面重複利用才可以提高演算法的效率。這個問題有子問題麼?考慮一個極端的例 子:a="XXX",b="XXX",c="XXXXXX"。子問題,顯然存在。再不然,畫出遞迴樹,就很明瞭了。

我們採用二維表來儲存子問題的結果,IL[i][j]如果為true,則表示c[0..i+j-1]是a[0..i-1]和b[0..j-1]的interleave字串。演算法實現的過程於上面的遞迴類似:

enter image description here

通過動態規劃的方法改進,演算法的時間複雜度O(mn),空間複雜度O(mn)。

【分析完畢】

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

相關文章