目录
题意:
给定三个字符串
s1、s2、s3,请你帮忙验证s3是否是由s1和s2交错 组成的。两个字符串
s和t交错 的定义与过程如下,其中每个字符串都会被分割成若干 非空 子字符串:
s = s1 + s2 + ... + snt = t1 + t2 + ... + tm|n - m| <= 1- 交错 是
s1 + t1 + s2 + t2 + s3 + t3 + ...或者t1 + s1 + t2 + s2 + t3 + s3 + ...注意:
a + b意味着字符串a和b连接。
【输入样例】s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"
【输出样例】true
解题思路:
1. 如果s1的长度+s2的长度不等于s3的长度,直接返回false,否则
2. 定义动态数组dp[i][j]表示s1的前i个元素和s2的第j个元素能够否交错组成s3的前i+j个元素;
3. dp[i][j]能否为true,取决于dp[i-1][j]是否为true&&s1[i]==s3[i+j],同理dp[i][j]也取决于dp[i][j-1]&&s2[j]==s3[i+j];
4. dp的边界条件应该是dp[0][0]=true,即s1和s2的前0个元素可以构成s3的前0个元素(都为空)。
- class Solution {
- public boolean isInterleave(String s1, String s2, String s3) {
- //先判断长度
- int len1 = s1.length();
- int len2 = s2.length();
- int len3 = s3.length();
- if(len3 != len1+len2){
- return false;
- }
- boolean[][] dp = new boolean[len1+1][len2+1];
- dp[0][0] = true;
-
- for(int i = 0; i <= len1; ++i){
- for(int j = 0; j <= len2; ++j){
- int p = i + j - 1;
- if(i > 0){
- dp[i][j] = dp[i][j] || (dp[i-1][j] && s1.charAt(i-1) == s3.charAt(p));
- }
- if(j > 0){
- dp[i][j] = dp[i][j] || (dp[i][j-1] && s2.charAt(j-1) == s3.charAt(p));
- }
- }
- }
- return dp[len1][len2];
- }
- }
时间: 击败了66.74%
内存: 击败了25.11%