本文主要是介绍Leetcode JAVA刷刷站(97)交错字符串,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、题目概述

二、思路方向
为了验证字符串
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方法中给出了两个示例来验证其正确性。
结语
愿你在人生的每一个阶段
都能遇见最好的自己
收获满满的幸福与成就
!!!

这篇关于Leetcode JAVA刷刷站(97)交错字符串的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!