leetcode-97.-交错字符串
描述
给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1 和 s2 交错组成的。 示例 1: 输入: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac" 输出: true 示例 2: 输入: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc" 输出: false
题解1, 暴力法, 通过递归实现,时间复杂度:O(2^{m+n})O(2 m+n) 。 m是 s1 的长度, n是 s2的长度。
空间复杂度:O(m+n)。递归栈的深度最多为 m+n 。
class Solution { public boolean isInterleave(String s1, String s2, String s3) { return is_interlevel(s1, 0, s2, 0, "", s3); } private boolean is_interlevel(String s1, int i, String s2, int j, String res, String s3 ) { if (res.equals(s3) && i == s1.length() && j == s2.length()) { return true; } boolean answer = false; if (i < s1.length()) { answer = answer | is_interlevel(s1, i+1, s2, j, res + s1.charAt(i), s3); } if (j < s2.length()) { answer = answer | is_interlevel(s1, i, s2, j+1, res+s2.charAt(j), s3); } return answer; } }
二维动态规划法, 时间复杂度:o(m*n), 空间复杂度:o(m*n)
class Solution { public boolean isInterleave(String s1, String s2, String s3) { if (s1.length() + s2.length() != s3.length()) { return false; } boolean dp[][] = new boolean[s1.length()+1][s2.length()+1]; for (int i = 0; i <= s1.length(); i++) { for (int j = 0; j <= s2.length(); j++) { if (i == 0 && j == 0) { dp[i][j] = true; } else if (i == 0) { dp[i][j] = dp[i][j - 1] && s2.charAt(j - 1) == s3.charAt(i + j - 1); } else if (j == 0) { dp[i][j] = dp[i - 1][j] && s1.charAt(i - 1) == s3.charAt(i + j - 1); } else { dp[i][j] = (dp[i - 1][j] && s1.charAt(i - 1) == s3.charAt(i + j - 1)) || (dp[i][j - 1] && s2.charAt(j - 1) == s3.charAt(i + j - 1)); } } } return dp[s1.length()][s2.length()]; } }
参考:https://leetcode-cn.com/problems/interleaving-string/submissions/