动态规划——字符串的交错组成(interleaving-string)

题目描述:要求是判断一个字符串能不能由两个字符串按照它们自己的顺序,每次挑取两个串中的一个字符来构造出来。

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

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


递归例程:

public class Solution {
    public boolean isInterleave(String s1, String s2, String s3) {
        if(s1 == null||s2 == null||s3 == null||s1.length()+s2.length()!=s3.length())
            return false;
        return help(s1,s2,s3,s1.length(),s2.length(),s3.length());
    }
    
    public boolean help(String s1,String s2,String s3,int i,int j,int k)
        {
        if(k == 0)
            return true;
        boolean result=false;
        if(i>=1&&s3.charAt(k-1) == s1.charAt(i-1))
            result=help(s1,s2,s3,i-1,j,k-1);
        if(j>=1&&result == false&&s3.charAt(k-1) == s2.charAt(j-1))
            result=help(s1,s2,s3,i,j-1,k-1);
        
            return result;
    }
}



DP:

 public boolean isInterleave(String s1, String s2, String s3) {
        if(s1.length()+s2.length()!=s3.length())
            return false;
        
        //dp[i][j]表示s1长为i,s2长为j时与s3的匹配情况。
        boolean[][] dp=new boolean[s1.length()+1][s2.length()+1];        //若新建矩阵dp[s1.length()][s2.length()],则当s1.length() == 0||s2.length() == 0时,对dp[0][0]赋值会越界。
      
        dp[0][0]=true;
       //s1中取0个s2中取i个 去和s3中0+i 个匹配</code>
        for(int j=1;j<=s2.length();j++)
            {
            if(s2.charAt(j-1) == s3.charAt(j-1)&&dp[0][j-1] == true)
            dp[0][j]=true;
        }
       //s2中取0个s1中取i个 去和s3中0+i 个匹配</code>
         for(int i=1;i<=s1.length();i++)
            {
            if(s1.charAt(i-1) == s3.charAt(i-1)&&dp[i-1][0] == true)
            dp[i][0]=true;
        }
        for(int i=1;i<=s1.length();i++)
            {
            for(int j=1;j<=s2.length();j++)
                {
               dp[i][j]=dp[i-1][j]&&(s3.charAt(i+j-1) == s1.charAt(i-1))
                   ||dp[i][j-1]&&(s3.charAt(i+j-1) == s2.charAt(j-1));
            }
        }
        return dp[s1.length()][s2.length()];
    }


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值