網上有用動態規劃解這題的,代碼量比較大.
我這裏用 深度優先遍歷 寫更簡單一些.
思路就是很常見的思路.
具體流程:
如果 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));
}
}
}