力扣(LeetCode)(交错字符串)Python3/golang

题目:交错字符串


给定三个字符串 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

猜你喜欢

转载自blog.csdn.net/adminkeys/article/details/107425056