网上有用动态规划解这题的,代码量比较大.
我这里用 深度优先遍历 写更简单一些.
思路就是很常见的思路.
具体流程:
如果 s1[i] 和 s2[j] 都不等于 s3[i+j] , 说明无解 , 返回false.
如果 s1[i] 等于 s3[i+j] , 递归判断 s1[i+1] , s2[j] 和 s3[i+j+1] 的关系.
如果 s2[j] 等于 s3[i+j] , 递归判断 s1[i] , s2[j+1] , 和 s3[i+j+1] 的关系.
直至 i+j=s3.len , 返回true.
描述
给出三个队列 s1,s2,s3 ,判断 s3 是否是由 s1 和 s2 交叉得来。 如:s1 为 aabcc , s2 为 dbbca。 当 s3 为 aadbbcbcac 时,返回 true(即将 s1 拆成三部分: aa,bc,c 分别插入 s2 对应位置) 否则返回 false。
代码
import java.util.Scanner;
public class Main{
//深度优先遍历
public static boolean dfsJudge(String s1, String s2, String s3, int i, int j) {
if (i + j == s3.length()) return true;
boolean flag = false;
if (i < s1.length() && s1.charAt(i) == s3.charAt(i + j)) {
flag = dfsJudge(s1, s2, s3, i + 1, j);
}
if (j < s2.length() && s2.charAt(j) == s3.charAt(i + j)) {
flag = flag || dfsJudge(s1, s2, s3, i, j + 1);
}
return flag;
}
public static void main(String args[]) {
Scanner scan = new Scanner(System.in);
String line;
while (scan.hasNextLine()) {
line = scan.nextLine().trim();
// please write your code here
String[] ss = line.split(",");
if (ss[0].length() + ss[1].length() != ss[2].length())
System.out.println(false);
else
System.out.println(dfsJudge(ss[0], ss[1], ss[2], 0, 0));
}
}
}