您的位置:首页 > 其它

【DP】Interleaving String

2014-03-31 20:26 351 查看
Given s1, s2, s3, 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.
解法一:用类似于归并的方式,可惜超时了

public class Solution {

public boolean dfs(String s1, int p1, String s2, int p2, String s3, int p3){
if(p3 == s3.length()) return true;
if(p2 == s2.length()) return s1.substring(p1).equals(s3.substring(p3));
if(p1 == s1.length()) return s2.substring(p2).equals(s3.substring(p3));

char c1 = s1.charAt(p1);
char c2 = s2.charAt(p2);
char c3 = s3.charAt(p3);

if(c1==c3 && c3==c2)
return dfs(s1, p1+1, s2, p2, s3, p3+1) || dfs(s1, p1, s2, p2+1, s3, p3+1);
if(c1==c3)
return dfs(s1, p1+1, s2, p2, s3, p3+1);
if(c2 == c3)
return dfs(s1, p1, s2, p2+1, s3, p3+1);

return false;
}

public boolean isInterleave(String s1, String s2, String s3) {
int len1 = s1.length();
int len2 = s2.length();
int len3 = s3.length();

if(len1 + len2 != len3) return false;

return dfs(s1, 0, s2, 0, s3, 0);
}

}

解法二:DP

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

关于DP里矩阵每一个格子所代表的意义看下面这一个图



(以下描述为 1 base)
dp[i][j]表示s1取前i位,s2取前j位,是否能组成s3的前i+j位

举个列子,注意左上角那一对箭头指向的格子dp[1][1], 表示s1取第1位a, s2取第1位d,是否能组成s3的前两位aa

从dp[0][1] 往下的箭头表示,s1目前取了0位,s2目前取了1位,我们添加s1的第1位,看看它是不是等于s3的第2位,( i + j 位)

从dp[1][0] 往右的箭头表示,s1目前取了1位,s2目前取了0位,我们添加s2的第1位,看看它是不是等于s3的第2位,( i + j 位)

public class Solution {

public boolean isInterleave(String s1, String s2, String s3) {
if(s1 == null || s2 == null || s3 == null) return false;

int len1 = s1.length();
int len2 = s2.length();
int len3 = s3.length();
if(len1 + len2 != len3) return false;

boolean d[][] = new boolean[len1+1][len2+1];
d[0][0] = true;

for(int i=1; i<=len1; i++){
if(s1.charAt(i-1) == s3.charAt(i-1) && d[i-1][0])
d[i][0] = true;
}
for(int j=1; j<=len2; j++){
if(s2.charAt(j-1) == s3.charAt(j-1) && d[0][j-1])
d[0][j] = true;
}

for(int i=1; i<=len1; i++){
for(int j=1; j<=len2; j++){
if(s1.charAt(i-1) == s3.charAt(i+j-1) && d[i-1][j])
d[i][j] = true;
if(s2.charAt(j-1) == s3.charAt(i+j-1) && d[i][j-1])
d[i][j] = true;
}
}
return d[len1][len2];
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: