97.交错字符串

101 阅读1分钟

题目:
给定三个字符串 s1s2s3,请你帮忙验证 s3 是否是由 s1 和 s2 **交错 组成的。

两个字符串 s 和 t 交错 的定义与过程如下,其中每个字符串都会被分割成若干 非空 子字符串:

  • s = s1 + s2 + ... + sn
  • t = 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]
}