排列子串;及翻譯字串分析

紫鳳發表於2013-10-16

今日面試題:排列子串

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

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

翻譯數字串分析

原題

翻譯數字串,類似於電話號碼翻譯:給一個數字串,比如12259,對映到字母陣列,比如,1 -> a, 2-> b,... , 12 -> l ,... 26-> z。那麼,12259 -> lyi 或 abbei 或 lbei 或 abyi。輸入一個數字串,判斷是否能轉換成字串,如果能,則列印所以有可能的轉換成的字串。動手寫寫吧。

分析轉自@lxhgww 的一條微博“special thanks to @陳利人,找工作準備過程中,翻完你的3600多條微博,而且看完了所有的評論,收到了Microsoft和Google總部的offer,最終簽約Google Mountain View”

首先要恭喜這位同學,我們能夠幫助到這位同學,是我們莫大的榮幸,也是對我們待字閨中的最大的鼓勵。我們會再接再厲,和同學們分享更多的題目。也希望同學們能夠積極的參與進來,踴躍的討論,各種思路進行碰撞。我們相信,不僅僅會對找工作有很大的幫助,對日常的工作也會有很大的促進的。

再一次恭喜這位同學!

開始今天的分析。這個題目是一個比較直接,比較簡單的題目。面試官會出這樣的題目,一般都是考察大家的coding的功力的。這個實話實說,真的沒有捷徑。就是多寫、多練,也可以閱讀優秀的程式碼,不斷的體會思路。

我們這裡來分析一下這個題目的分析思路。看完這個描述,我們應該注意到一下的細節:

* 對映是在[1,26]這個範圍內數字

* 輸入的字串是否包括0或者負數?

這些細節要注意,不明確的要諮詢面試官,要不然,很容易讓你的程式出現漏洞。面試官也比較在意這個互動的過程。

充分理解題目的含義、目的之後,很直接的就可以想到這個題目可以用遞迴解決。如原題中的例子:12259,它有兩個遞迴的子問題,(1)2259和(12)259,前面的括號表示是否能夠通過對映表翻譯。同理每一個子問題,都會表示為這樣的兩個子問題。

接下來,我們考慮(1)2259的兩個子問題:

1. (12)259

2. (122)59

大家有注意到,第一個和12259的一個子問題重複了。大家是否對這個似曾相識呢?當大家把遞迴過程的樹形結構畫出來,會發現更多的重複子問題,這就給了我們改進的空間,只需要取消這些重複計算就可以了。

第一個方法就是記憶法,將計算過的結果快取起來,這樣可以後續接著使用。但是更近一步,我們是可以採用動態規劃的方法的。很多同學也都直接的想到了。

上面的過程,是為初學者指的路,希望能對大家有所幫助。但還有一個細節,大家要注意,這個題目不僅僅是判斷是否可以,還需要列印出來所有的情況。這個細節要在程式設計的時候注意。

【分析完畢】

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

相關文章