【发布时间】:2021-08-15 09:13:43
【问题描述】:
我是数据结构和算法的初学者。我正在解决这个我卡住的问题。我相信我的方法是正确的,但我在 LeetCode 上提交解决方案时收到了WA。
问题Link - 给定三个字符串 s1、s2 和 s3,判断 s3 是否由 s1 和 s2 交织而成。
解决方法 - 我使用蛮力(递归方法),我使用三个指针,如果在其中任何一个中找到匹配项,则移动它们。这是我的方法(我不知道为什么会失败)-
public boolean isInterleave(String s1, String s2, String s3) {
if(s1.length() + s2.length() != s3.length())
return false;
return isInterleave(s1, s2, s3, 0, 0, 0);
}
private boolean isInterleave(String s1, String s2, String s3, int i, int j, int k){
if(i == s1.length() && j == s2.length() && k == s3.length())
return true;
if(i >= s1.length())
return s2.charAt(j) == s3.charAt(k) ? isInterleave(s1, s2, s3, i, j + 1, k + 1): false;
if(j >= s2.length())
return s1.charAt(i) == s3.charAt(k) ? isInterleave(s1, s2, s3, i + 1, j, k + 1): false;
if(s1.charAt(i) == s3.charAt(k) && s2.charAt(j) != s3.charAt(k))
return isInterleave(s1, s2, s3, i + 1, j, k + 1);
if(s1.charAt(i) != s3.charAt(k) && s2.charAt(j) == s3.charAt(k))
return isInterleave(s1, s2, s3, i, j + 1, k + 1);
if(s1.charAt(i) == s3.charAt(k) && s2.charAt(j) == s3.charAt(k))
return isInterleave(s1, s2, s3, i + 1, j, k + 1) || isInterleave(s2, s2, s3, i, j + 1, k + 1);
return false;
}
请告诉我我的错误。
此外,我相信这个解决方案的时间复杂度是O(2^(M + N)),其中 M 和 N 是字符串长度。我想使用记忆化(自上而下的方法),但我发现很难想到它,因为解决方案需要布尔值。谁能告诉我如何处理这个问题?
【问题讨论】:
-
倒数第二行错误为
isInterleave(s2, s2, s3, i, j + 1, k + 1)。应该是isInterleave(s1, s2, s3, i, j + 1, k + 1)。
标签: java string algorithm recursion