题目:输入三个字符串s1、s2和s3,判断第三个字符串s3是否由前两个字符串s1和s2交错而成,即不改变s1和s2中各个字符原有的相对顺序,例如当s1 = “aabcc”,s2 = “dbbca”,s3 = “aadbbcbcac”时,则输出true,但如果s3=“accabdbbca”,则输出false。
自己写的程序有问题,看了大神的代码,还不是太理解,网上该题目相关的分析很少。在此做一个记录,留着以后再慢慢理解。
public class test_str {
public static boolean IsInterleave(String s1, String s2, String s3)
{
int n = s1.length(), m = s2.length(), s = s3.length();
//如果长度不一致,则s3不可能由s1和s2交错组成
if (n + m != s)
return false;
boolean[][]dp = new boolean[n + 1][m + 1];
//在初始化边界时,我们认为空串可以由空串组成,因此dp[0][0]赋值为true。
dp[0][0] = true;
for (int i = 0; i < n + 1; i++){
for (int j = 0; j < m + 1; j++){
if ( dp[i][j] ||
(i - 1 >= 0 && dp[i - 1][j] == true && s1.charAt(i - 1) == s3.charAt(i + j - 1)) ||
(j - 1 >= 0 && dp[i][j - 1] == true && s2.charAt(j - 1) == s3.charAt(i + j - 1)) )
dp[i][j] = true;
else
dp[i][j] = false;
}
}
return dp[n][m];
}
public static void main(String[] args) {
String s1,s2,s3;
s1="aabcc";
s2="dbbca";
s3="aadbbcbcac";
//s3="accabdbbca";
boolean res=IsInterleave(s1,s2,s3);
System.out.println(res);
}
}
感觉关键是理解矩阵dp的含义,以题目所给示例为例,其dp矩阵的值为:
0 | 1 | 2 | 3 | 4 | 5 | |
0 | 1 | 0 | 0 | 0 | 0 | 0 |
1 | 1 | 0 | 0 | 0 | 0 | 0 |
2 | 1 | 1 | 1 | 1 | 1 | 0 |
3 | 0 | 1 | 1 | 0 | 1 | 0 |
4 | 0 | 0 | 1 | 1 | 1 | 1 |
5 | 0 | 0 | 0 | 1 | 0 | 1 |
最后根据dp[5][5]=1,得出结果为true。