leetCode 97. Interleaving String

本文介绍了一种使用动态规划解决字符串交织问题的方法。该方法通过从后向前比较两个输入字符串与目标交织字符串,判断目标字符串是否能由两个输入字符串交织而成。

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

Given s1, s2, s3, 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.

给定s1,s2,每次从s1或者s2取出一个字符,判断是否最终能够组成s3
思路:用动态规划,从后面开始,右边的子串能够成功,左边才有可能成功
每次取字符选择s1,s2都有可能,即:
if(dp[i+1][j]==true&&s1.charAt(i)==s3.charAt(i+j)
||dp[i][j+1]==true&&s2.charAt(j)==s3.charAt(i+j)){
dp[i][j]=true;
}

 public static boolean isInterleave(String s1, String s2, String s3) {
         if(s1.equals("")&&s2.equals("")&&s3.equals(""))return true;
            if(s1.length()+s2.length()!=s3.length()){
                return false;
            }
           int m = s1.length();
           int n= s2.length();
           int z = s3.length();
           if(m==0)
               return s2.equals(s3);
           if(n==0)
               return s1.equals(s3);
           boolean dp[][] = new boolean[m+1][n+1];
           dp[m][n]=true;
           if(s1.charAt(m-1)==s3.charAt(m+n-1))
               dp[m-1][n] = true;
           for(int i=m-2;i>=0;i--){
               if(dp[i+1][n]==false)
                   dp[i][n]=false;
               else if(s1.charAt(i)==s3.charAt(i+n)){
                   dp[i][n]=true;
               }
               else
                   dp[i][n]=false;

           }
           if(s2.charAt(n-1)==s3.charAt(m+n-1))
               dp[m][n-1] = true;
           for(int i=n-2;i>=0;i--){
               if(dp[m][i+1]==false)
                   dp[m][i]=false;
               else if(s2.charAt(i)==s3.charAt(i+m)){
                   dp[m][i]=true;
               }
               else
                   dp[m][i]=false;

           }
           for(int i=m-1;i>=0;i--){
               for(int j=n-1;j>=0;j--){
                   if(dp[i+1][j]==false&&dp[i][j+1]==false){
                       dp[i][j]=false;
                   }
                   else if(dp[i+1][j]==true&&s1.charAt(i)==s3.charAt(i+j)
                           ||dp[i][j+1]==true&&s2.charAt(j)==s3.charAt(i+j)){
                       dp[i][j]=true;
                   }
                   else 
                       dp[i][j]=false;
               }
           }

         return dp[0][0];
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值