标签:
Given three strings: s1, s2, s3, determine whether s3 is formed by the interleaving of s1 and s2.
For s1 = "aabcc"
, s2 = "dbbca"
"aadbbcbcac"
, return true
."aadbbbaccc"
, return false
.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]; } }
[LintCode] Interleaving String
标签:
原文地址:http://www.cnblogs.com/tritritri/p/4955527.html