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/
浙公网安备 33010602011771号