字串的交錯組成

2021-09-25 21:46:01 字數 1700 閱讀 8478

題目

給定三個字串str1, str2和aim, 如果aim包含且僅包含str1和str2的所有字元,而且在aim中屬於str1的字元之間保持原來在str1中的順序,屬於str2的字元之間保持原來在str2中的順序,那麼稱aim是str1和str2的交錯組成。實現乙個函式,判斷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

"""經典動態規劃方法"""

def iscross(str1,str2,aim):

if str1 == none or str2 == none or aim == none or len(aim)!=len(str1) + len(str2):

return false

dp = [[flase for i in range(len(str1)+1)] for j in range(len(str2)+1)]

dp[0][0] = true

for i in range(1,len(str1)):

if str1[i-1] != aim[i-1]:

break

dp[i][0] = true

for j in range(1,len(str2)):

if str1[j-1]!=aim[j-1]:

break

dp[0][j] = true

for 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] = true

return dp[-1][-1]

字串交錯組成

問題描述 對於三個字串a,b,c。我們稱c由a和b交錯組成當且僅當c包含且僅包含a,b中所有字元,且對應的順序不改變。請編寫乙個高效演算法,判斷c串是否由a和b交錯組成。給定三個字串a,b和c,及他們的長度。請返回乙個bool值,代表c是否由a和b交錯組成。保證三個串的長度均小於等於100。測試樣例...

字串交錯組成

對於三個字串a,b,c。我們稱c由a和b交錯組成當且僅當c包含且僅包含a,b中所有字元,且對應的順序不改變。請編寫乙個高效演算法,判斷c串是否由a和b交錯組成。給定三個字串a,b和c,及他們的長度。請返回乙個bool值,代表c是否由a和b交錯組成。保證三個串的長度均小於等於100。測試樣例 abc ...

字串的交錯組成

題 目 給定三個字串str1 str2和aim。如果aim包含且僅包含來 自str1和str2的所有字 符,而且在aim中屬於str1的字元之間保持原來在str1中的順序,屬於str2的字元 之間保持原來在str2中的順序,那麼稱aim是str1和str2的交錯組成。實現 乙個函 數,判斷aim是否...