题目:
判断字符串A,B是否可以组成C
如:A "bbcdd" B "eccdb" C "bbeccdcdbd"
此时是可以的。
思路:
这是一道动态规划问题,首先最重要的就是定义状态:
f(i,j): A[0-i] 跟 B[0-j] 是否可以组成 C[0-(i+j)]
如若可以,那么f(i,j)为true, 如果不可以,f(i,j)为false。
然后状态转移方程可以写出:
f(i,j)=(f(i-1,j)&A[i]==c[i+j]) | f(i,j-1)&B[i]==c[i+j])
最后我们给出代码:
public static boolean isInterleave(String a, String b, String c){
int m = a.length();
int n = b.length();
if(m+n!=c.length()){return false;} // 长度不一致
boolean arr[][] = new boolean[m+1][n+1];
// 初始化arr数组
arr[0][0] = true;
for (int i = 1; i <= n; i++) {
arr[0][i] = arr[0][i-1] & (b.charAt(i-1)==c.charAt(i-1));
}
for (int i = 1; i <= m; i++) {
arr[i][0] = arr[i-1][0] & (a.charAt(i-1)==c.charAt(i-1));
}
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
arr[i][j] = (arr[i][j-1] & b.charAt(j-1)==c.charAt(i+j-1)) | (arr[i-1][j] & a.charAt(i-1)==c.charAt(i+j-1));
}
}
return arr[m][n];
}
测试代码:
public static void main(String[] args) {
String a = "bbcdd";
String b = "eccdb";
String c = "bbeccdcdbd";
System.out.println(isInterleave(a, b, c));
}
结果:
true false false false false false
true false false false false false
true true true true true false
false true true false true false
false false true true true true
false false false true false true
true