小米OJ 6.交叉隊列 深度優先遍歷解法

網上有用動態規劃解這題的,代碼量比較大.

我這裏用 深度優先遍歷 寫更簡單一些.

思路就是很常見的思路.

 

具體流程:

如果 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));
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章