小米OJ 6.交叉队列 深度优先遍历解法

本文介绍一种使用深度优先遍历(DFS)算法解决交错字符串问题的方法,通过递归判断两个字符串s1和s2能否交错组成第三个字符串s3。文章详细阐述了算法流程,包括边界条件检查、字符匹配及递归调用,并提供了完整的Java实现代码。

网上有用动态规划解这题的,代码量比较大.

我这里用 深度优先遍历 写更简单一些.

思路就是很常见的思路.

 

具体流程:

如果 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));
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值