day111(3.13)——leetcode面试经典150

97. 交错字符串

97. 交错字符串

题目:

题解:

java 复制代码
class Solution {
    int[][] dp;
    public boolean isInterleave(String s1, String s2, String s3) {
       int m = s1.length();
       int n = s2.length();
       //如果二者长度不同,那必然是不能被表示的
       if(n+m!=s3.length()) {
        return false;
       }
        //用dp数组表示是否能被a/b表示
       dp = new int[m+1][n+1];
       for(int[] row:dp) {
        Arrays.fill(row, -1);   //-1表示没有计算过
       }
        char[] a = s1.toCharArray();
        char[] b = s2.toCharArray();
        char[] c = s3.toCharArray();
        return dfs(m-1, n-1, a, b, c);
    }

    boolean dfs(int l, int r, char[] a, char[] b, char[] c) {
        if(l<0 && r<0) {
            return true;
        }
        //这是是剪枝,把重复的砍掉
        if(dp[l+1][r+1]!=-1) {  //之前计算过
            return dp[l+1][r+1]==1;
        }

        boolean res = l >= 0 && a[l]==c[l+r+1] && dfs(l-1,r,a,b,c) ||
                        r >=0 && b[r]==c[l+r+1] && dfs(l,r-1,a,b,c);
        dp[l+1][r+1]=res?1:0;
        return res;
    }
}
java 复制代码
class Solution {
    public boolean isInterleave(String s1, String s2, String s3) {
       int m = s1.length();
       int n = s2.length();
       //如果二者长度不同,那必然是不能被表示的
       if(n+m!=s3.length()) {
        return false;
       }
       char[] a = s1.toCharArray();
       char[] b = s2.toCharArray();
       char[] c = s3.toCharArray();
       boolean[][] dp = new boolean[m+1][n+1];
       dp[0][0]=true;
       for(int i=0;i<n;i++) {
            dp[0][i+1]=b[i]==c[i]&&dp[0][i];
        }
        for(int i=0;i<m;i++) {
            dp[i+1][0]=a[i]==c[i]&&dp[i][0];
            for(int j=0;j<n;j++) {
                dp[i+1][j+1]=a[i]==c[i+j+1]&&dp[i][j+1] ||
                            b[j]==c[i+j+1]&&dp[i+1][j];
            }
        }
        return dp[m][n];
    }
}
相关推荐
_清歌10 分钟前
DSpark 深度解读:DeepSeek-V4 如何用「半自回归」把推理速度提升 85%
算法
统计实现局11 分钟前
SVD 的三步走:双对角化、Givens 收敛、排序
算法
躬行见万象12 分钟前
《VLA 系列》UniLab 强化训练 | G1 机器人 |复现
算法
统计实现局12 分钟前
对称不定分解(Bunch-Kaufman):为什么 Cholesky 不够用
算法
统计实现局13 分钟前
dqrsl 拆解:拿着 QR 结果能算出哪 5 种东西
算法
程序员七平18 分钟前
面试官:你说你Vibe Coding手拿把掐,那 Claude Code 用户级、项目级、本地级配置怎么隔离?
面试
统计实现局22 分钟前
为什么 Cholesky 求逆比 Gauss-Jordan 快一倍——行列式溢出防护详
算法
葫芦和十三1 小时前
图解 MongoDB 17|大集合与工作集:数据超过内存怎么办
后端·mongodb·面试
葫芦和十三9 小时前
图解 MongoDB 18|复制集拓扑:Primary、Secondary 和 Arbiter 的分工
后端·mongodb·面试
To_OC12 小时前
LC 994 腐烂的橘子:人人都说是 BFS 入门题,我却写了三遍才过
javascript·算法·leetcode