字符串的交错组成
題目
給定三個字符串str1, str2和aim, 如果aim包含且僅包含str1和str2的所有字符,而且在aim中屬于str1的字符之間保持原來在str1中的順序,屬于str2的字符之間保持原來在str2中的順序,那么稱aim是str1和str2的交錯組成。實現(xiàn)一個函數(shù),判斷aim是否是str1和str2的交錯組成。
舉例
str1 = “AB”, str2 = “12”。那么”AB12”, “A1B2”, “A12B”, “1A2B”, “1AB2”等都是str1和str2的交錯組成。
基本思路
假設str1的長度為N,str2的長度為M,生成(N+1)*(M+1)的dp矩陣,為什么是N+1,M+1,因為我們需要在字符串的開頭添加一個空字符的特殊情況,dp[i][j]的值代表aim[0…i+j-1]能否被str1[0…i-1]和str2[0…j-1]交錯組成,dp[i][j]的值計算如下:
矩陣的第一行表示能否只用str2[0…j-1]交錯組成aim[0…j-1],如果str2[0…j-1]等于aim[0…j-1],則令dp[0][j] = True,否則為False
矩陣的第一列同上,如果str1[0…i-1]等于aim[0…i-1],則令dp[i][0] = True,否則為False
矩陣的其余位置由以下情況決定:?
1)dp[i-1][j]代表aim[0…i+j-2]能否被str1[0…i-2]和str2[0…j-1]交錯組成,如果可以,那么如果再有str1[i-1]等于aim[i+j-1],說明str1[i-1]又可以作為交錯組成aim[0…i+j-1]的最后一個字符。令dp[i][j] = True
2)dp[i][j-1]代表aim[0…i+j-2]能否被str2[0…j-2]和str1[0…i-1]交錯組成,如果可以,那么如果再有str2[j-1]等于aim[i+j-1],說明str2[j-1]又可以作為交錯組成aim[0…i+j-1]的最后一個字符。令dp[i][j] = True
3)如果上述情況不滿足,令dp[i][j] = False
"""經(jīng)典動態(tài)規(guī)劃方法"""def isCross(str1,str2,aim):if str1 == None or str2 == None or aim == None or len(aim)!=len(str1) + len(str2):return Falsedp = [[Flase for i in range(len(str1)+1)] for j in range(len(str2)+1)]dp[0][0] = Truefor i in range(1,len(str1)):if str1[i-1] != aim[i-1]:breakdp[i][0] = Truefor j in range(1,len(str2)):if str1[j-1]!=aim[j-1]:breakdp[0][j] = Truefor i in range(1,len(str1)):for j in range(1,len(str2)):if dp[i-1][j] == True and str1[i-1] == aim[i+j-1] or(dp[i][j-1] == True and str2[j-1]==aim[i+j-1]):dp[i][j] = Truereturn dp[-1][-1]?
總結(jié)