第48题 Interleaving String

本文介绍如何使用Java动态规划解决字符串交织问题,通过给定的s1、s2和s3,判断s3是否可以由s1和s2交织形成。详细解释了算法逻辑并提供了Java代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Given s1s2s3, find whether s3 is formed by the interleaving of s1 and s2.

For example,
Given:
s1 = "aabcc",
s2 = "dbbca",

When s3 = "aadbbcbcac", return true.
When s3 = "aadbbbaccc", return false.

Hide Tags
  Dynamic Programming String











Solution in Java:(Dynamic)
public class Solution {
    public boolean isInterleave(String s1, String s2, String s3) {
        if(s1=="")  return  s2.equals(s3);
        if(s2=="") return s1.equals(s3);
        
        int len1=s1.length(), len2 = s2.length(), len3 = s3.length();
        if(len3!=len1+len2) return false;
        
        boolean[][] opj = new boolean[len1+1][len2+1];
        //opj[i][j] denotes if s1[0...i-1] and s2[0...j-1] can form s3[0...i+j-1].
        //so opj[len1][len2] denotes  if s1[0...len1-1] and s2[0...len2-1] can from s3[0...len1+len2-1],
        //which is the answer we need.
        
        opj[0][0]=true;
        
        for(int j=1; j<len2+1; j++) opj[0][j] = s2.charAt(j-1)==s3.charAt(j-1);
        
        for(int i=1; i<len1+1; i++) opj[i][0] = s1.charAt(i-1)==s3.charAt(i-1);
        
        for(int i=1; i<len1+1; i++){
            for(int j=1; j<len2+1; j++){
                opj[i][j] = opj[i-1][j]&&s1.charAt(i-1)==s3.charAt(i+j-1)|| //add char in s1
                            opj[i][j-1]&&s2.charAt(j-1)==s3.charAt(i+j-1);  //add char in s2
            }
        }
        return opj[len1][len2];
    }
}

Note: 只关心s3[0...i+j-1]是否能由s1[0...i-1]和s2[0...j-1]形成,不关心之前怎样形成的具体过程。
而在s3[0...i+j-2]合法的前提下,要s3[0...i+j-1]也合法,需要由s1或s2中添加一个合法字母。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值