题目:
给定三个字符串 s1、s2、s3,请你帮忙验证 s3 是否是由 s1 和 s2 **交错 组成的。
两个字符串 s 和 t 交错 的定义与过程如下,其中每个字符串都会被分割成若干 非空 子字符串:
s = s1 + s2 + ... + snt = t1 + t2 + ... + tm|n - m| <= 1- 交错 是
s1 + t1 + s2 + t2 + s3 + t3 + ...或者t1 + s1 + t2 + s2 + t3 + s3 + ...
注意: a + b 意味着字符串 a 和 b 连接。
算法:
方法一:动态规划
dp[i+j] = true, 说明dp[i+j]能由s1的前i个元素和s2的前j个元素能“交错“得到,有两种情况
1)s3[i+j-1] == s1[i] 且s1的前i-1个元素和s2的前j个元素“交错而成”,或者
2)s3[i+j-1] == s2[j] 且s1的前i个元素和s2的前j-1个元素“交错而成”。
func isInterleave(s1 string, s2 string, s3 string) bool {
m := len(s1)
n := len(s2)
if m + n != len(s3) {
return false
}
dp := make([]bool, n + 1)
dp[0] = true
for i := 0; i <= m; i ++ {
for j := 0; j <= n; j ++ {
p := i + j - 1
if i > 0 {
// dp[j] || dp[j] && s1[i - 1] == s3[p]
dp[j] = dp[j] && s1[i - 1] == s3[p]
}
if j > 0 {
dp[j] = dp[j] || dp[j - 1] && s2[j - 1] == s3[p]
}
}
}
return dp[n]
}