97. Interleaving String
# Hard 太难了
How to define interLeave[i][j]
is the key. Two-sequence DP problem. interLeave[i][j] means s1[:i]
and s2[:j]
can completely match string of s3[:i+j]
. bool value.
如何实现 interLeave[i][j]
,如何做这道题,取决于如何定义interLeave
这种有循环直奔结果的数组,并且正确的初始化第一个元素
Solution:
Initilize
interLeave[len(s1)+1][len(s2)+1]
,interLeave[i][0]
andinterLeave[0][j]
Two cases can match:
s1[i] = s3[i+j]
andinterLeave[i-1][j]=True
s2[j] = s3[i+j]
andinterLeave[i][j-1]=True
Then
interLeave[i][j] = True
class Solution:
def isInterleave(self, s1: str, s2: str, s3: str) -> bool:
# edge case
if len(s1)+len(s2) != len(s3):
return False
# interLeave[i][j] means if first i of s1 and j of s2 can be first (i+j) of s3 interleaving string
# initialize interLeave
interLeave = [[False]*(len(s2)+1) for i in range(len(s1)+1)]
interLeave[0][0] = True
for i in range(1, len(s1)+1):
if s1[:i] == s3[:i]:
interLeave[i][0] = True
for j in range(1, len(s2)+1):
if s2[:j] == s3[:j]:
interLeave[0][j] = True
# copmute
for i in range(1, len(s1)+1):
for j in range(1, len(s2)+1):
if s1[i-1] == s3[i+j-1] and interLeave[i-1][j] == True:
interLeave[i][j] = True
if s2[j-1] == s3[i+j-1] and interLeave[i][j-1] == True:
interLeave[i][j] = True
return interLeave[len(s1)][len(s2)]
Don't forget edge case, which can save a lot of time.
Last updated
Was this helpful?