【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 =
s2 =
When s3 =
When s3 =
解法一:用类似于归并的方式,可惜超时了
解法二: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 位)
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]; } }
相关文章推荐
- 97. Interleaving String (String; DP)
- Interleaving String——是否由两个string交叉、DP
- [leetcode] Interleaving String@DP
- [LeetCode] Interleaving String(dp)
- LeetCode Interleaving String DP
- Interleaving String(DP应用)
- leetcode -- Interleaving String -- 2D dp经典
- leetcode 97. Interleaving String(字符串交错出现) DFS深度优先遍历 + 很明显很经典的DP动态规划做法
- Leetcode dp Interleaving String
- [LeetCode.DP]Interleaving String
- 97. Interleaving String(dp)
- Interleaving String [leetcode] DP
- LeetCode-97-Interleaving String DP 记忆化搜索
- Posts Tagged 【dp】Interleaving String
- LeetCode:Interleaving String
- 【leetcode】Interleaving String
- Interleaving String(Leetcode)
- LeetCode(97) Interleaving String
- [LeetCode] Interleaving String 解题报告
- ***Interleaving String