LeetCode每日一题 交错字符串 (golang)

题目
在这里插入图片描述
分析过程:

这里还是用到动态规划的思想

1.如果s1+s2不等于s3,那么s1,s2,必然不和s3交错
2.如果s1+s2等于s3,那么我们定义 f(i, j)表示 s1的前i个元素和s2的前j个元素能否交错组成s3的前 i + j个元素
这个问题就能转化为之前地下城勇士等一系列的动态路径题

s3的每个字符都是从s1(向下)或者s2(向右)拿到的,所以只要判断是否存在这条s3路径即可
到达(i,j)可能由(i-1,j)点向下一步,选择s1[i-1]到达;也可能由(i,j-1)点向右一步,选择s2[j-1]到达
那么给出动态规划方程

f(i,j)=[f(i−1,j)&&s3(i+j−1)=s1(i-1)]||[f(i,j−1)&&s2 (j−1)=s3(i+j-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             //判断s1+s2是否等于s3
    }
    dp := make([]bool, m + 1)
    dp[0] = true               //考虑起点即为终点
    for i := 0; i <= n; i++ {
        for j := 0; j <= m; j++ {
            if i > 0 {
                dp[j] = dp[j] && s1[i-1] == s3[i+j-1]  //判断i=0时 的边界状况
            }
            if j > 0 {
                dp[j] = dp[j] || dp[j-1] && s2[j-1] == s3[i+j-1]  //计算一般情况下
            }
        }
    }
    return dp[m]    
}

猜你喜欢

转载自blog.csdn.net/qq_46595591/article/details/107427963