本文主要是介绍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)交错字符串的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!