题目:交错字符串
给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1 和 s2 交错组成的。
示例 1:
输入: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"
输出: true
示例 2:
输入: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc"
输出: false
题解思路:
1.动态规划
2.回溯算法
1.动态规划(pyhton/go)
if len(s1) + len(s2) != len(s3):
return False
if s1 == '':
return s2 == s3
if s2 == '':
return s1 == s3
dp = [s2[:j]==s3[:j] for j in range(len(s2)+1)]
for i in range(len(s1)+1):
dp[0] = s1[:i]==s3[:i]
for j in range(1, len(s2)+1):
dp[j] = (s1[i-1] == s3[i+j-1] and dp[j]) or (s2[j-1] == s3[i+j-1] and dp[j-1])
return dp[-1]
func isInterleave(s1 string, s2 string, s3 string) bool {
n, m, t := len(s1), len(s2), len(s3)
if (n + m) != t {
return false
}
f := make([][]bool, n + 1)
for i := 0; i <= n; i++ {
f[i] = make([]bool, m + 1)
}
f[0][0] = true
for i := 0; i <= n; i++ {
for j := 0; j <= m; j++ {
p := i + j - 1
if i > 0 {
f[i][j] = f[i][j] || (f[i-1][j] && s1[i-1] == s3[p])
}
if j > 0 {
f[i][j] = f[i][j] || (f[i][j-1] && s2[j-1] == s3[p])
}
}
}
return f[n][m]
}
2.回溯算法(python3 )
if len(s1+s2)!=len(s3):return False
h={}
def dfs(x,y,z):
if (x,y,z)in h:return h[(x,y,z)]
if not z:return not x and not y
if not y:return x==z
if not x:return y==z
ans=(x[0]==z[0] and dfs(x[1:],y,z[1:])) or (y[0]==z[0] and dfs(x,y[1:],z[1:]))
h[(x,y,z)]=ans
return ans
return dfs(s1,s2,s3)
结果:
28ms代码欣赏:
len1=len(s1)
len2=len(s2)
len3=len(s3)
if(len1+len2!=len3):
return False
dp=[[False]*(len2+1) for i in range(len1+1)]
dp[0][0]=True
for i in range(1,len1+1):
dp[i][0]=(dp[i-1][0] and s1[i-1]==s3[i-1])
for i in range(1,len2+1):
dp[0][i]=(dp[0][i-1] and s2[i-1]==s3[i-1])
for i in range(1,len1+1):
for j in range(1,len2+1):
dp[i][j]=(dp[i][j-1] and s2[j-1]==s3[i+j-1]) or (dp[i-1][j] and s1[i-1]==s3[i+j-1])
return dp[-1][-1]
题解参考:(LeetCode)ID:力扣官方题解、jie_de_zhou