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

[LintCode] Interleaving String

时间:2015-11-11 12:59:30      阅读:228      评论:0      收藏:0      [点我收藏+]

标签:

Interleaving String

Given three strings: s1s2s3, determine whether s3 is formed by the interleaving of s1 and s2.

Example

For s1 = "aabcc", s2 = "dbbca"

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

O(n2) time or better

 

SOLUTION:

这题乍一看,给了三个字符串,以为是个三维dp,但是注意,如果满足条件,s3由s1和s2交叉组成,那么s3.length == s1.length + s2.length,于是三维变成了二维dp。

首先先来做一个二维boolean,存放结果,然后看看特殊情况直接排除掉,就是 s1长度+s2长度不等于s3长度。

然后考虑dp状态,就是s1(first i) + s2(first j) ? s3(first i + j)。

转移方程:if s1(i) == s3(i + j) == > f(i,j) = f (i - 1, j)

              if s2(j) == s3(i + j) == > f(i,j) = f (i, j - 1)

初始化:f(0, 0) = true ==> f初始化(0,0)点是为了保证第一个进行判断的(1,1)(1,0)(0,1)进行判断

结果: f(s1.len, s2.len);

技术分享
public class Solution {
    /**
     * Determine whether s3 is formed by interleaving of s1 and s2.
     * @param s1, s2, s3: As description.
     * @return: true or false.
     */
    public boolean isInterleave(String s1, String s2, String s3) {
        int m = s1.length();
        int n = s2.length();
        int t = s3.length();
        if (m + n != t){
            return false;
        }
        boolean[][] result = new boolean[m + 1][n + 1];
        result[0][0] = true;
        for (int i = 1; i <= m; i++){
            if (s1.charAt(i - 1) == s3.charAt(i - 1) && result[i - 1][0]){
                result[i][0] = true;
            }
        }
        for (int i = 1; i <= n; i++){
            if (s2.charAt(i - 1) == s3.charAt(i - 1) && result[0][i - 1]){
                result[0][i] = true;
            }
        }
        for (int i = 1; i <= m; i++){
            for (int j = 1; j <= n; j++){
                if ((s1.charAt(i - 1) == s3.charAt(i + j - 1) && result[i - 1][j]) || (s2.charAt(j - 1) == s3.charAt(i + j - 1) && result[i][j - 1])){
                    result[i][j] = true;
                }
            }
        }
        return result[m][n];
    }
}
View Code

 

[LintCode] Interleaving String

标签:

原文地址:http://www.cnblogs.com/tritritri/p/4955527.html

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