leetcode 97. 交错字符串

题目链接
这题目真的很容易想到双指针。。。。

思路:动态规划
分析:如果两边长度不一样,那么肯定不行。
dp[i][j]=true 表示s1的前i个字符和s2的前j个字符能拼出来s3的前i+j个字符。
那么dp[i][j]的状态 取决于
s1的前i-1个字符和s2的前j个字符的状态和s1的第i-1个字符与s3的第i+j-1个字符有关
s1的前i个字符和s2的前j-1个字符状态和s2的第i的个字符与s3的第i+j-1个字符有关

代码化:
dp[i][j] |= (dp[i-1][j] && s1.charAt(i-1)==s3.charAt(i3));
dp[i][j] |= (dp[i][j-1] && s2.charAt(j-1)==s3.charAt(i3));

代码:

class Solution {
    public boolean isInterleave(String s1, String s2, String s3) {
        //要是两边长度不一样,肯定拼不出来
        if(s1.length() + s2.length() != s3.length()){
            return false;
        }

        int len1 = s1.length(),len2 = s2.length(), len3 = s3.length();
        // 两边相等,都等于0,那肯定就能拼出来
        if(len3==0){
            return true;
        }
        //有一部分为空字符串的,那么只需要比对另一部分和目标是否一致
        if(len1==0){
            return s2.equals(s3);
        }else if(len2==0){
            return s1.equals(s3);
        }

        //dp[i][j]=true  表示s1前i个字符和s2前j个字符,能拼出来s3前i+j个字符 [0,i-1]   [0,j-1]
        boolean[][] dp = new boolean[len1+1][len2+1];

        dp[0][0] = true;
        for(int i = 0 ; i<= len1;i++){
            for(int j = 0 ; j <= len2;j++){
                //标志s3的下标
                int i3 = i+j-1;
                if(i>0){
                    dp[i][j] |= (dp[i-1][j] && s1.charAt(i-1)==s3.charAt(i3));
                }
                if(j>0){
                    dp[i][j] |= (dp[i][j-1] && s2.charAt(j-1)==s3.charAt(i3));
                }
            }
        }
        return dp[len1][len2];
    }
}

被隔离了,题也做不了了。。。。
希望所有人平安渡过。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值