题目来源:https://leetcode.cn/problems/IY6buf/
大致题意:
给定三个字符串,前两个字符串在保证前后顺序不变的情况下,能否交叉组成第三个字符串
图片来自力扣
思路
一开始用双指针做的,然后判断失败了
看了题解明白需要使用 dp
使用二维布尔数组 dp[i][j] 表示 s1 的前 i 个字符与 s2 的前 j 个字符能组成 s3 的前 i + j 个字符
于是当出现以下两种情况时,dp[i][j] 为真:
- s1 的第 i 个字符与 s3 的第 i + j 个字符相等,且 dp[i - 1][j] 为真
- s2 的第 j 个字符与 s3 的第 i + j 个字符相等,且 dp[i][j - 1] 为真
初始时,dp[0][0] = true,即两个空串可以组成一个空串
代码:
public boolean isInterleave(String s1, String s2, String s3) {
int l1 = s1.length();
int l2 = s2.length();
int l3 = s3.length();
if (l1 + l2 != l3) {
return false;
}
// 状态数组
// dp[i][j] 表示 s1 的前 i 个字符与 s2 的前 j 个字符能组成 s3 的前 i + j 个字符
boolean[][] dp = new boolean[l1 + 1][l2 + 1];
// 初始化,两个空串可以组成一个空串
dp[0][0] = true;
for (int i = 0; i <= l1; i++) {
for (int j = 0; j <= l2; j++) {
// 字符串 s3 的索引
int idx = i + j - 1;
// 索引大于等于 0 时才有意义
if (idx >= 0) {
// 若当前 s1 索引处字符与 s3 索引处相等,且 dp[i - 1][j] 为真,则 dp[i][j] 为真
if (i > 0 && s1.charAt(i - 1) == s3.charAt(idx) && dp[i - 1][j]) {
dp[i][j] = true;
} else if (j > 0 && s2.charAt(j - 1) == s3.charAt(idx) && dp[i][j - 1]) {
dp[i][j] = true;
}
}
}
}
return dp[l1][l2];
}