interleave字串;及括號匹配分析

紫鳳發表於2013-09-22

今日面試題:interleave字串

3個字串a,b,c。判斷c是否是a和b的interleave,也就是c中應該有a,b中所有字 符,並且c中字元順序和a,b中一樣。比如,a = "ef" b = "gh" c = "egfh" return true;a = "ef" b = "gh" c = "ehgf" return false。

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

括號匹配分析

原題

給定字串,輸出括號是否匹配,例如,

1. "()" yes;

2. ")(" no;

3. "(abcd(e)" no;

4. "(a)(b)" yes。

要求必須用遞迴寫,整個實現不可以出現一個迴圈語句。

分析

這個題目很多同學都見過了,如果沒有後面的條件,會張口就說就來用棧來實現,時間複雜度O(n),空間複雜度O(n)。這個是很好的一個解答,沒有 問題的。但是我們在做面試題,準備面試的過程中,每一個題目都不應該僅僅侷限於某一個方法。應該嘗試更多的思路,儘管有些思路的時間、空間複雜度並不是很 好,但是可以帶來變化,舉一反三,這才是真正的收穫。

這個題要求了,只目能使用遞迴併且不能出現迴圈語句。這個時候,我們應該如何處理呢?其實告訴了大家遞迴,就比較好想了:怎麼定義好問題和子問題。

如果字串中的括號是匹配的,則'('的數量和')'的數量是相等的,反之是不相等的。這樣,在遞迴的過程中,可以儲存一個變數,用來記錄'('的 數量和')'的數量是否匹配。這樣定義遞迴問題f(p,count),表示當前字元p之前的字串中'('的數量和')'的數量的匹配情況,p表示指向當 前字元的指標。初始的時候,f(p, 0),遞迴的過程如下:

1. 如果p為空,則考察count是否為0,如果為0,則匹配;如果不為0,則不匹配;

2. 如果不為空,則考察當前字元p,如果p='(',則遞迴呼叫f(p++, count++);如果p=')',則遞迴呼叫f(p++, count--)。如果p是其他的字元,並不是'('和')',則遞迴呼叫f(p++, count),count不變,繼續考慮下一次字元。其中需要檢查和保證count>=0.

其實,遞迴的問題有的時候不是那麼好像的,需要大家不斷的練習。如果不採用count來記錄括號匹配的情況,這個題目的遞迴也不好想。

【分析完畢】

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

相關文章