目录
97. 交错字符串
97. 交错字符串
题意:
给定三个字符串
s1
、s2
、s3
,请你帮忙验证s3
是否是由s1
和s2
交错 组成的。两个字符串
s
和t
交错 的定义与过程如下,其中每个字符串都会被分割成若干 非空 子字符串:
s = s1 + s2 + ... + sn
t = 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%