其他分享
首页 > 其他分享> > leetcode 97. 交错字符串

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];
    }
}

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

标签:charAt,s3,s2,s1,97,dp,字符串,leetcode,个字符
来源: https://blog.csdn.net/weixin_42496727/article/details/123581652