给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1 和 s2 交错组成的。
示例 1:
输入: s1 = “aabcc”, s2 = “dbbca”, s3 = “aadbbcbcac”
输出: true
示例 2:
输入: s1 = “aabcc”, s2 = “dbbca”, s3 = “aadbbbaccc”
输出: false
第一次的代码:
递归判断
def jc(s1,s2,s3):
if len(s3)!=len(s1)+len(s2):
return False
if s3=='':
return True
else:
a=s3[0]
if s1 and a == s1[0] and jc(s1[1:],s2,s3[1:]):#若s3[0]是s1[0]
return True
if s2 and a == s2[0] and jc(s1,s2[1:],s3[1:]):#若s3[0]是s2[0]
return True
return False#若以上两种情况都不成立,返回False
return jc(s1,s2,s3)
在倒数第二个例子超时了。
第二次代码:
采用动态规划,做完这题还是有一些心得,即s1,s2每次只能拿出第一个字母来组成s3,首先写出dp表的第一行,第一列,dp[0][0]指的是s1,s2都为空的时候,这时候是True,对于第一排,dp[0][1]要为T,首先s1的第一个字母要和s3[0]相同才行,列也是一样的。两个for循环执行dp[i][j]的迭代。
if len(s3)!= len(s1+s2):#若长度不符合
return False
dp=[[False for i in range(len(s1)+1)] for j in range(len(s2)+1)]
dp[0][0]=True
for i in range(1,len(s2)+1):#注意for循环里面有一个+1
dp[i][0]=dp[i-1][0] and (s2[i-1]==s3[i-1])
for i in range(1,len(s1)+1):
dp[0][i]=dp[0][i-1] and (s1[i-1]==s3[i-1])
for i in range(1,len(s2)+1):
for j in range(1,len(s1)+1):
#当使用s2的字母,即在dp表往下走一格
dp[i][j]=dp[i][j] or (dp[i-1][j] and (s2[i-1]==s3[i+j-1]))
#当使用s1的字母,即在dp表往右走一格,即True的轨迹只能是下或者左
dp[i][j]=dp[i][j] or (dp[i][j-1] and (s1[j-1]==s3[i+j-1]))
print(dp)
return dp[len(s2)][len(s1)]
60ms,排名23%