LeetCode97. 交错字符串
题目描述
/**
*
* 给定三个字符串 s1、s2、s3,请你帮忙验证 s3 是否是由
* s1 和 s2 交错 组成的。
* <p>
* 两个字符串 s 和 t 交错 的定义与过程如下,
* 其中每个字符串都会被分割成若干 非空 子字符串:
* <p>
* 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 连接。
*
*/
思路分析
- 验证s3是否是由s1, s2交错组成的,首先需要明白交错的含义
- 可以使用动态规划的思路,创建一个二维动态规划数组,用来记录从s1中取出i个字符,从s2中取出j个字符后是否可以交错组成s3的前 i + j位
- 即如果字符串1的第i位如果等于字符串3的第p位,则字符串1的第i - 1位和字符串2的第j位就可以交错组成字符串3的第 p - 1位
- 字符串2也同理
- 源码见下
源码及分析
/**
*
* @param s1 字符串1
* @param s2 字符串2
* @param s3 字符串3
* @return
*/
public boolean isInterleave(String s1, String s2, String s3) {
//记录三个字符串的长度
int m = s1.length(), n = s2.length(), t = s3.length();
//如果s1的长度+s2的长度不等于s3的长度
if (m + n != t) {
return false;
}
//定义动态规划数组
boolean[][] is = new boolean[m + 1][n + 1];
//边界条件
is[0][0] = true;
//扫描第一个字符串
for (int i = 0; i <= m; i++) {
//扫描第二个字符串
for (int j = 0; j <= n; j++) {
int p = i + j - 1;
//如果第三个字符串的第 p 位字符等于第一个字符的 第i位字符
if (i > 0 && s3.charAt(p) == s1.charAt(i - 1)) {
is[i][j] = is[i][j] || is[i - 1][j];
}
//如果第三个字符串的第 p 位字符等于第二个字符的 第j位字符
if (j > 0 && s3.charAt(p) == s2.charAt(j - 1)) {
is[i][j] = is[i][j] || is[i][j - 1];
}
}
}
return is[m][n];
}