码迷,mamicode.com
首页 > 其他好文 > 详细

[leetcode] Interleaving String

时间:2014-07-03 19:28:48      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   strong   os   

Given s1s2s3, find whether s3 is formed by the interleaving of s1 and s2.

For example,
Given:
s1 = "aabcc",
s2 = "dbbca",

When s3 = "aadbbcbcac", return true.
When s3 = "aadbbbaccc", return false.

https://oj.leetcode.com/problems/interleaving-string/

 

1. dfs枚举。

2. DP。dp[i][j]表示s1长度为i字符串和s2长度为j字符串能否组成s3的i+j长度的字符串。

  初始化:第一行和第一列。

  递推:dp[i][j] == true if dp[i - 1][j] && s1.charAt(i - 1) == s3.charAt(i + j - 1)  or  dp[i][j - 1] && s2.charAt(j - 1) == s3.charAt(i + j - 1)

 

bubuko.com,布布扣
public class Solution {
    // dp
    public boolean isInterleave(String s1, String s2, String s3) {
        if (s1 == null || s2 == null || s3 == null)
            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++) {
            dp[i][0] = (s1.charAt(i - 1) == s3.charAt(i - 1)) && dp[i - 1][0];
        }

        for (int j = 1; j <= n; j++) {
            dp[0][j] = (s2.charAt(j - 1) == s3.charAt(j - 1) && dp[0][j - 1]);
        }

        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                if (dp[i - 1][j] && s1.charAt(i - 1) == s3.charAt(i + j - 1))
                    dp[i][j] = true;
                if (dp[i][j - 1] && s2.charAt(j - 1) == s3.charAt(i + j - 1))
                    dp[i][j] = true;
            }
        }

        return dp[m][n];
    }

    // dfs
    public boolean isInterleave2(String s1, String s2, String s3) {
        if (s1.length() + s2.length() != s3.length())
            return false;
        return rec(s1, 0, s2, 0, s3, 0);
    }

    private boolean rec(String s1, int p1, String s2, int p2, String s3, int p3) {
        if (p3 == s3.length())
            return true;
        if (p1 == s1.length())
            return s2.substring(p2).equals(s3.substring(p3));
        if (p2 == s2.length())
            return s1.substring(p1).equals(s3.substring(p3));
        if (s1.charAt(p1) == s3.charAt(p3) && s2.charAt(p2) == s3.charAt(p3))
            return rec(s1, p1 + 1, s2, p2, s3, p3 + 1) || rec(s1, p1, s2, p2 + 1, s3, p3 + 1);
        else if (s1.charAt(p1) == s3.charAt(p3))
            return rec(s1, p1 + 1, s2, p2, s3, p3 + 1);
        else if (s2.charAt(p2) == s3.charAt(p3))
            return rec(s1, p1, s2, p2 + 1, s3, p3 + 1);
        else
            return false;
    }

    public static void main(String[] args) {
        String s1 = "aabcc";
        String s2 = "dbbca";
        String s3 = "aadbbcbcac";
        String s4 = "aadbbbaccc";
        System.out.println(new Solution().isInterleave(s1, s2, s3));
    }
}
View Code

 

参考:

http://blog.csdn.net/u011095253/article/details/9248073

[leetcode] Interleaving String,布布扣,bubuko.com

[leetcode] Interleaving String

标签:style   blog   http   color   strong   os   

原文地址:http://www.cnblogs.com/jdflyfly/p/3821266.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!