题目
分析过程:
这里还是用到动态规划的思想
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]
}