問題描述
Given 2 strings A and B, generate all possible solutions when B is merged with A.
Example: A = "hey", B = "sam"
out: heysam, hseaym, hesaym, sahemy etc. Notice order.
給出兩個字符串A和B,要求在不打亂A和B各自的順序下,返回A和B融合的所有可能結果。也就是說,融合的結果忽略A的字符,B仍然是原來的順序,對A亦然。
詢問補充
對于產生的重復結果如何處理?假設接受重復結果。
結果對順序有沒有要求?假設沒有。
思路分析
這個題的思路應該比較容易想出來,至少不會一上來想暴力破解。
實在要暴力破解,那就要把A和B全部混在一起打亂,然后全排列,然后一個個判斷是不是遵循A和B原來的順序。說實話實現起來還有點麻煩。
其實很明顯的一個方法就是遞歸。反正每次從A或者B取一個字符,添加到結果集里面之后再遞歸下一層即可。
例如,對A="hey"第一次選'h',B="sam",其結果集就是A="ey"B="sam"的結果集所有字符串前面附加上一個'h'。
代碼
class Solution:
def merge(self, A, B):
if not A or not B:
return [A or B]
ret = []
for s in self.merge(A[1:], B):
ret.append(A[0] + s)
for s in self.merge(A, B[1:]):
ret.append(B[0] + s)
return ret
公式:T(m,n) = T(m-1,n)+T(m,n-1)=C(n,m+n)=(m+n)!/(m!*n!),聯想從[0,0]到[m,n]矩陣的走法。
總結
題目難度easy-medium,但是復雜度可能不是很容易計算。