Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2.
Example 1:
Input: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac" Output: trueExample 2:
Input: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc" Output: false
交错字符串。题意是给 s1, s2 和 s3,验证 s3 是否是由 s1 和 s2 交错组成的。这是典型的二维DP题,设DP[i][j]是s1的前i个字符 + s2的前j个字符组成的结果是否能跟s3的前i + j个字符匹配。首先排除corner case,如果s1 + s2的长度不等于s3,则说明是不行的。另外,还需要先在二维数组中计算出当s1为空和当s2为空的时候相对应的DP值。最后normal case是这两种其中一种为true则dp[i][j]为true。
- s1的前i - 1个字符 + s2的前j个字符
- s1的前i个字符 + s2的前j - 1个字符
其实也就是s1和s2拼接出来的部分的最后一个字符可来自于s1也可来自于s2,只要有一种情况为true则整体就为true。
时间O(mn)
空间O(mn)
Java实现
1 class Solution { 2 public boolean isInterleave(String s1, String s2, String s3) { 3 // corner case 4 if ((s1.length() + s2.length()) != s3.length()) { 5 return false; 6 } 7 8 boolean[][] dp = new boolean[s1.length() + 1][s2.length() + 1]; 9 dp[0][0] = true; 10 11 // when s2 is empty 12 for (int i = 1; i < dp.length; i++) { 13 dp[i][0] = dp[i - 1][0] && (s1.charAt(i - 1) == s3.charAt(i - 1)); 14 } 15 16 // when s1 is empty 17 for (int i = 1; i < dp[0].length; i++) { 18 dp[0][i] = dp[0][i - 1] && (s2.charAt(i - 1) == s3.charAt(i - 1)); 19 } 20 21 for (int i = 1; i < dp.length; i++) { 22 for (int j = 1; j < dp[0].length; j++) { 23 dp[i][j] = (dp[i - 1][j] && s1.charAt(i - 1) == s3.charAt(i + j - 1)) 24 || (dp[i][j - 1] && s2.charAt(j - 1) == s3.charAt(i + j - 1)); 25 } 26 } 27 28 return dp[s1.length()][s2.length()]; 29 } 30 }