题目描述:
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.
解题思路:
- 这道题的意思就是判 s3 是否有 s1 和 s2 组合而成,并且 s1 和 s2 中的字符保持相对位置不变
- 这道题同样适合用动态规划来求解
- 设置 boolean dp[i][j],i 表示 s1 中的字符, j 表示 s2 中的字符,画出状态转移表,
X | X | d | b | b | c | a |
---|---|---|---|---|---|---|
X | 1 | 0 | 0 | 0 | 0 | 0 |
a | 1 | 0 | 0 | 0 | 0 | 0 |
a | 1 | 1 | 1 | 1 | 1 | 0 |
b | 0 | 1 | 1 | 0 | 1 | 0 |
c | 0 | 0 | 1 | 1 | 1 | 1 |
c | 0 | 0 | 0 | 1 | 0 | 1 |
代码如下:
public boolean isInterleave(String s1, String s2, String s3) {
int len1 = s1.length();
int len2 = s2.length();
int len3 = s3.length();
if(len1 + len2 != len3)return false;
boolean [][] dp = new boolean[len1 + 1][len2 + 1];
dp[0][0] = true;
// 初始化第一行,第一列
// 假定 s1 为空,取出 s2 中的字符与 s3 比较
for(int i = 1; i <= len2; i++){
dp[0][i] = dp[0][i - 1] && s2.charAt(i - 1) == s3.charAt(i -1);
}
// 假定 s2 为空,取出 s1 中的字符与 s3 比较
for(int i = 1; i <= len1; i++){
dp[i][0] = dp[i -1][0] && s1.charAt(i - 1) == s3.charAt(i - 1);
}
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];
}