[leetcode]interleaving string

题目描述

Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2.

For example,
Given:
s1 = “aabcc”,
s2 = “dbbca”,

When s3 = “aadbbcbcac”, return true.
When s3 = “aadbbbaccc”, return false.

代码

dp[i][j]表示s1[0…i-1]和s2[0…j-1]能表示s3[0…i+j-1],即s1的前i个字符和s2的前j个字符能按规则表示s3的前i+j个字符。则:

dp[i][j] = dp[i-1][j] && s1[i-1] == s3[i+j-1] 或者 dp[i][j-1] && s2[j-1] == s3[i+j-1]

结果为:

dp[s1.length()][s2.length()]

边界情况:

i=0,j=0:dp[i][j] = true,表示s1、s2、s3都未空字符串
i=0 dp[i][j] = dp[i][j-1] && s2[j-1] == s3[i+j-1]
j=0 dp[i][j] = dp[i-1][j] && s1[i-1] == s3[i+j-1]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class Solution{
public boolean (String s1, String s2, String s3) {

if(s1.length() + s2.length() != s3.length()) return false;
boolean[][] dp = new boolean[s1.length() + 1][s2.length() + 1];

for(int i = 0; i <= s1.length(); i++){
for(int j = 0; j <= s2.length(); j++){
//都为空字符串
if(i == 0 && j == 0) {
dp[i][j] = true;
}else if(i == 0){
//s1为空字符串
dp[i][j] = dp[i][j-1] && s2.charAt(j-1) == s3.charAt(i+j-1);
}else if(j == 0){
//s2为空字符
dp[i][j] = dp[i-1][j] && s1.charAt(i-1) == s3.charAt(i+j-1);
}else{
//有两种情况s3[i+j-1]取自s1[i-1]或者取自s2[j-1]
dp[i][j] = (dp[i][j-1] && s2.charAt(j-1) == s3.charAt(i+j-1)) || (dp[i-1][j] && s1.charAt(i-1) == s3.charAt(i+j-1));
}
}
}
return dp[s1.length()][s2.length()];
}
}