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