Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2.
For example,
Given:
s1 = "aabcc"
,
s2 = "dbbca"
,
When s3 = "aadbbcbcac"
, return true.
When s3 = "aadbbbaccc"
, return false.
class Solution:
# @return a boolean
def isInterleave(self, s1, s2, s3):
if len(s1)+len(s2) != len(s3):
return False
if len(s1)==0 or len(s2)==0 or len(s3)==0:
if len(s1)==0:
return s2==s3
if len(s2)==0:
return s1==s3
if len(s3)==0:
return len(s1)==0 and len(s2)==0
if s1[0] != s2[0]:
if s1[0]==s3[0]:
return self.isInterleave(s1[1:],s2,s3[1:])
elif s2[0]==s3[0]:
return self.isInterleave(s1,s2[1:],s3[1:])
else:
return False
else:
if s1[0]!=s3[0]:
return False
else:
return self.isInterleave(s1[1:],s2,s3[1:]) or self.isInterleave(s1,s2[1:],s3[1:])
#动态规划
class Solution:
# @return a boolean
def isInterleave(self, s1, s2, s3):
if len(s1)+len(s2) != len(s3):
return False
if len(s1)==0 or len(s2)==0 or len(s3)==0:
if len(s1)==0:
return s2==s3
if len(s2)==0:
return s1==s3
if len(s3)==0:
return len(s1)==0 and len(s2)==0
# s1,s2,s3 are not empty
mark = [[False for i in range(len(s2)+1)] for j in range(len(s1)+1)]
for i in range(len(s1)+1):
for j in range(len(s2)+1):
if i==0 or j==0:
if i==0 and j==0:
mark[0][0] = True
elif i==0:
mark[i][j]=((s2[j-1]==s3[i+j-1]) and mark[i][j-1])
else:
mark[i][j]=((s1[i-1]==s3[i+j-1]) and mark[i-1][j])
else:
mark[i][j]=((s2[j-1]==s3[i+j-1]) and mark[i][j-1]) or \
((s1[i-1]==s3[i+j-1]) and mark[i-1][j])
return mark[-1][-1]