zoukankan      html  css  js  c++  java
  • [97. 交错字符串]

    [97. 交错字符串]

    给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1s2 交错组成的。

    示例 1:

    输入: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"
    输出: true
    

    示例 2:

    输入: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc"
    输出: false
    

    思路:经典的动态规划问题

    dp[i][j]s1的前i个字符和s2的前j个字符是否符合, dp[0][0] == true

    递推方程:

    dp[i][j] = (dp[i-1][j]&(s1[i-1]==s3[i+j-1])) | (dp[i][j-1]&(s2[j-1]==s3[i+j-1]))

    注意边界即可

    优化:由于计算当前状态只会用到二位矩阵中的上面和左面的状态,可以将空间复杂度优化为O(n)

    public boolean isInterleave(String s1, String s2, String s3) {
    
            if(s1.length() + s2.length() != s3.length()){
                return false;
            }
            boolean[][] dp = new boolean[s1.length()+1][s2.length()+1];
            dp[0][0] = true;
    
            for (int i = 0; i <= s1.length(); i++) {
                for (int j = 0; j <= s2.length(); j++) {
                    if(j > 0){
                        dp[i][j] |= dp[i][j-1] & (s2.charAt(j-1) == s3.charAt(i+j-1));
                    }
                    if(i > 0){
                        dp[i][j] |= dp[i-1][j] & (s1.charAt(i-1) == s3.charAt(i+j-1));
                    }
                }
            }
    
            return dp[s1.length()][s2.length()];
    
        }
    
    因为我喜欢追寻过程中的自己
  • 相关阅读:
    Word Puzzles [POJ 1204]
    set用法
    FOJ有奖月赛2012年11月
    BerDonalds
    POJ1469 匈牙利算法
    后缀数组
    ZOJ Monthly, January 2013
    算法导论<一>
    Yell Classico
    点聚 WebOffice 编辑辅助控件 WebOffice.OCX
  • 原文地址:https://www.cnblogs.com/IzuruKamuku/p/14359749.html
Copyright © 2011-2022 走看看