原题
https://leetcode.cn/problems/interleaving-string/description/
思路
动态规划
复杂度
时间:O(len(s1) * len(s2))
空间:O(len(s1) * len(s2))
Python代码
class Solution:
def isInterleave(self, s1: str, s2: str, s3: str) -> bool:
l1 = len(s1)
l2 = len(s2)
l3 = len(s3)
if l1 + l2 != l3:
return False
dp = [[False] * (l2+1) for i in range((l1+1))]
dp[0][0] = True
for i in range(1, l1+1):
dp[i][0] = dp[i-1][0] and s1[i-1] == s3[i-1]
for j in range(1, l2+1):
dp[0][j] = dp[0][j-1] and s2[j-1] == s3[j-1]
for i in range(1, l1+1):
for j in range(1, l2+1):
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[-1][-1]
Go代码
func isInterleave(s1 string, s2 string, s3 string) bool {
l1, l2, l3 := len(s1), len(s2), len(s3)
if l1+l2 != l3 {
return false
}
dp := make([][]bool, l1+1)
for i := 0; i < l1+1; i++ {
dp[i] = make([]bool, l2+1)
}
// 初始化
dp[0][0] = true
for i := 1; i < l1+1; i++ {
dp[i][0] = dp[i-1][0] && s1[i-1] == s3[i-1]
}
for j := 1; j < l2+1; j++ {
dp[0][j] = dp[0][j-1] && s2[j-1] == s3[j-1]
}
for i := 1; i < l1+1; i++ {
for j := 1; j < l2+1; j++ {
dp[i][j] = (dp[i-1][j] && s1[i-1] == s3[i+j-1]) || (dp[i][j-1] && s2[j-1] == s3[i+j-1])
}
}
return dp[l1][l2]
}

被折叠的 条评论
为什么被折叠?



