一、题目概述
二、思路方向
为了验证字符串
s3
是否由s1
和s2
交错组成,我们可以使用动态规划(Dynamic Programming, DP)的方法来解决这个问题。首先,我们需要定义状态
dp[i][j]
,它表示s1
的前i
个字符和s2
的前j
个字符是否能交错组成s3
的前i+j
个字符。接下来,我们考虑状态转移方程:
- 如果
s1[i-1] == s3[i+j-1]
(即s1
的第i
个字符与s3
的第i+j
个字符相等),那么dp[i][j]
可以从dp[i-1][j]
转移而来,即s1
的前i-1
个字符和s2
的前j
个字符交错组成s3
的前i+j-1
个字符后,再加上s1
的第i
个字符。- 同理,如果
s2[j-1] == s3[i+j-1]
(即s2
的第j
个字符与s3
的第i+j
个字符相等),那么dp[i][j]
可以从dp[i][j-1]
转移而来。初始条件为:
dp[0][0] = true
,因为两个空字符串可以交错组成空字符串。- 对于
dp[0][j]
(j > 0
),只有当s2
的前j
个字符与s3
的前j
个字符完全相等时,dp[0][j]
才为true
。- 同理,对于
dp[i][0]
(i > 0
),只有当s1
的前i
个字符与s3
的前i
个字符完全相等时,dp[i][0]
才为true
。最后,我们只需要检查
dp[len(s1)][len(s2)]
是否为true
,其中len(s1)
和len(s2)
分别是s1
和s2
的长度。
三、代码实现
public class Solution {
public boolean isInterleave(String s1, String s2, String s3) {
int len1 = s1.length(), len2 = s2.length(), len3 = s3.length();
if (len1 + len2 != len3) {
return false; // 长度不匹配,直接返回false
}
boolean[][] dp = new boolean[len1 + 1][len2 + 1];
dp[0][0] = true; // 初始化
// 初始化第一行
for (int j = 1; j <= len2; j++) {
dp[0][j] = dp[0][j - 1] && s2.charAt(j - 1) == s3.charAt(j - 1);
}
// 初始化第一列
for (int i = 1; i <= len1; i++) {
dp[i][0] = dp[i - 1][0] && s1.charAt(i - 1) == s3.charAt(i - 1);
}
// 填充DP表
for (int i = 1; i <= len1; i++) {
for (int j = 1; j <= len2; j++) {
dp[i][j] = (dp[i - 1][j] && s1.charAt(i - 1) == s3.charAt(i + j - 1)) ||
(dp[i][j - 1] && s2.charAt(j - 1) == s3.charAt(i + j - 1));
}
}
return dp[len1][len2];
}
public static void main(String[] args) {
Solution solution = new Solution();
String s1 = "aab";
String s2 = "axb";
String s3 = "aabxb";
System.out.println(solution.isInterleave(s1, s2, s3)); // 输出 true
}
}
执行结果:
四、小结
这段代码定义了一个
isInterleave
方法来判断s3
是否可以由s1
和s2
交错组成,并在main
方法中给出了两个示例来验证其正确性。
结语
愿你在人生的每一个阶段
都能遇见最好的自己
收获满满的幸福与成就
!!!