LintCode 交叉字符串 动态规划

题目:原题地址

给出三个字符串:s1、s2、s3,判断s3是否由s1和s2交叉构成。

 

比如 s1 = "aabcc" s2 = "dbbca"

    - 当 s3 = "aadbbcbcac",返回  true.

    - 当 s3 = "aadbbbaccc", 返回 false.

 

题目相当短,就是喜欢这种言简意赅的描述= =

dp[i][j]表示第一个字符串前i个字符,第二个字符串前j个字符,与s3中前i+j个字符的匹配与否

 

public boolean isInterleave(String s1, String s2, String s3) {
        if(s3.equals("")&&(s1.equals("")&&s2.equals("")))
            return true;
        if(s3.equals("")||(s1.equals("")&&s2.equals("")))
            return false;
        int m = s1.length();
        int n =s2.length();
        if(m+n>s3.length())
            return false;
        boolean[][] dp = new boolean[m+1][n+1];
        dp[0][0] = true;
        for(int i=1;i<=m;i++){
            if(s1.charAt(i-1)==s3.charAt(i-1)){
                dp[i][0] = true;
            }
        }
        for(int i=1;i<=n;i++){
            if(s2.charAt(i-1)==s3.charAt(i-1)){
                dp[0][i] = true;
            }
        }
        
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
          //s1找到了,与s3匹配
                if(s1.charAt(i)==s3.charAt(i+1+j)){
                    dp[i+1][j+1] = dp[i+1][j+1]||dp[i][j+1];
                }
                //s2找到了,与s3匹配
                if(s2.charAt(j)==s3.charAt(i+j+1)){
                    dp[i+1][j+1] = dp[i+1][j+1]||dp[i+1][j];
                }
            }
        }
        
        return dp[m][n];
    }

 

 

posted @ 2017-08-21 17:56  夏天的冬天  阅读(300)  评论(0编辑  收藏  举报