描述
给出三个队列 s1,s2,s3 ,判断 s3 是否是由 s1 和 s2 交叉得来。 如:s1 为 aabcc , s2 为 dbbca。 当 s3 为 aadbbcbcac 时,返回 true(即将 s1 拆成三部分: aa,bc,c 分别插入 s2 对应位置) 否则返回 false。
输入样例
aabcc,dbbca,aadbbcbcac
输出样例
true
我的代码
private static String solution(String line) {
// 在此处理单行数据
String[] arr1 = line.split(",");
int len1 = arr1[0].length();
int len2 = arr1[1].length();
int len3 = arr1[2].length();
if (len3 != len1 + len2)
return false + "";
if (len1 == 0)
return (arr1[1] == arr1[2]) + "";
if (len2 == 0)
return (arr1[0] == arr1[2]) + "";
int[][] dp = new int[len1 + 1][len2 + 1];
dp[0][0] = 1;
// init the dp array
for (int i = 1; i <= len1; i++) {
if (arr1[0].charAt(i-1) == arr1[2].charAt(i-1))
dp[i][0] = dp[i - 1][0];
}
for (int i = 1; i <= len2; i++) {
if (arr1[1].charAt(i-1) == arr1[2].charAt(i-1))
dp[0][i] = dp[0][i - 1];
}
// dp
for (int i = 1; i < len1 + 1; i++) {
for (int j = 1; j < len2 + 1; j++) {
int t = i + j;
if (arr1[0].charAt(i-1) == arr1[2].charAt(t-1)) {
dp[i][j] = dp[i - 1][j] | dp[i][j];
}
if (arr1[1].charAt(j-1) == arr1[2].charAt(t-1)) {
dp[i][j] = dp[i][j - 1] | dp[i][j];
}
}
}
// 返回处理后的结果
if (dp[len1][len2] == 1)
return true + "";
return false + "";
}
参考/借鉴(咳咳)
Monster丶Xu 的 交叉字符串问题、判断字符串s3是不是由字符串s1和s2交叉组合而成