【题目】
Given s1, s2, s3, find whether s3 is formedby the interleaving of s1 and s2.
For example,
Given:
s1 = "aabcc",
s2 = "dbbca",
When s3 = "aadbbcbcac", returntrue.
When s3 = "aadbbbaccc", returnfalse.
给定三个字符串S1,S2,S3,判断S3是否能够由S1,S2交错组合而成。
【思路】
二维动态规划:
s1 = "aabcc" s2 = "dbbca" s3 = "aadbbcbcac"
s1, s2只有两个字符串,因此可以展平为一个二维地图,判断是否能从左上角走到右下角。dp[i][j]就表示s1的前i个和s2的前j个是否和s3的前i+j个匹配成功
标1的匹配成功。
当s1到达第i个元素,s2到达第j个元素:
地图上往右一步就是s2[ j-1]匹配s3[i+j-1]。
地图上往下一步就是s1[ i-1]匹配s3[i+j-1]。
【Python实现】
class Solution(object):
def isInterleave(self, s1, s2, s3):
"""
:type s1: str
:type s2: str
:type s3: str
:rtype: bool
"""
len_s1 = len(s1)
len_s2 = len(s2)
len_s3 = len(s3)
if len_s1 + len_s2 != len_s3:
return False
dp = [[False for i in range(len_s2 + 1)] for j in range(len_s1 + 1)]
for i in range(0,len_s1 + 1):
for j in range(0,len_s2 + 1):
if i == 0 and j == 0:
dp[i][j] = True
elif i == 0:
dp[i][j] = dp[i][j-1] and (s2[j-1] == s3[j-1])
elif j == 0:
dp[i][j] = dp[i-1][j] and (s1[i-1] == s3[i-1])
else:
dp[i][j] = (dp[i-1][j] and s1[i-1] == s3 [i + j - 1]) or (dp[i][j-1] and s2[j-1]== s3[i+j-1])
return dp[len_s1][len_s2]