97. Interleaving String
题目
Given s1
, s2
, s3
, find whether s3
is formed by the interleaving of s1
and s2
.
For example,
Given:
s1 = "aabcc",
s2 = "dbbca",
When s3 = "aadbbcbcac"
, return true.
When s3 = "aadbbbaccc"
, return false.
题目解析
本题有三个字符串,字符串3是由字符串1,2交替形成的。看到这个题目,想到是一种搜索,在字符串1,2的序列中搜索字符串3。很快写出下列代码:
class Solution {
public:
bool solve(string s1, string s2, string s3, int idx1, int idx2, int idx)
{
if (idx == s3.size())
return true;
bool f = false;
if (idx1<s1.size() && s1[idx1] == s3[idx])
{
f = f || solve(s1, s2, s3, idx1 + 1, idx2, idx + 1);
}
if (idx2<s2.size() && s2[idx2] == s3[idx])
{
f = f || solve(s1, s2, s3, idx1, idx2 + 1, idx + 1);
}
return f;
}
bool isInterleave(string s1, string s2, string s3) {
if (s1.size() + s2.size() != s3.size())
return false;
return solve(s1, s2, s3, 0, 0, 0);
}
};
然而是悲剧的,在第99个例子的时候超时了。应该是有地方算重复了。
s1 = "bbbbbabbbbabaababaaaabbababbaaabbabbaaabaaaaababbbababbbbbabbbbababbabaabababbbaabababababbbaaababaa";
s2 = "babaaaabbababbbabbbbaabaabbaabbbbaabaaabaababaaaabaaabbaaabaaaabaabaabbbbbbbbbbbabaaabbababbabbabaab";
s3 = "babbbabbbaaabbababbbbababaabbabaabaaabbbbabbbaaabbbaaaaabbbbaabbaaabababbaaaaaabababbababaababbababbbababbbbaaaabaabbabbaaaaabbabbaaaabbbaabaaabaababaababbaaabbbbbabbbbaabbabaabbbbabaaabbababbabbabbab";
备忘录方法
仔细一看这个测试用例,在这样只有两种字符的情况下,如果用原来的搜索,在判断字符是否相等时会经常进入递归,会多次搜到同一个位置,有很多的重复搜索部分,造成超时,因此想到用备忘录方法。改进如下,就AC了~
class Solution {
public:
bool solve(string s1, string s2, string s3, int idx1, int idx2, int idx, vector<vector<int>> &dp)
{
if (idx == s3.size())
return true;
if (dp[idx1][idx2] != -1) // 已经搜索过这个位置
{
if (dp[idx1][idx2] == 1)
return true;
return false;
}
bool f = false;
if (idx1 < s1.size() && s1[idx1] == s3[idx])
{
f = f || solve(s1, s2, s3, idx1 + 1, idx2, idx + 1,dp);
}
if (idx2 < s2.size() && s2[idx2] == s3[idx])
{
f = f || solve(s1, s2, s3, idx1, idx2 + 1, idx + 1,dp);
}
dp[idx1][idx2] = f;
return f;
}
bool isInterleave(string s1, string s2, string s3) {
int len1 = s1.size();
int len2 = s2.size();
vector<vector<int>> f(len1+1, vector<int>(len2+1, -1));
if (s1.size() + s2.size() != s3.size())
return false;
return solve(s1, s2, s3, 0, 0, 0,f);
}
};
以后在做这种搜索类的题目时应该仔细想想是否有重复,避免走弯路。
欢迎指正。