Leetcode 97. Interleaving String

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);
    }
};

以后在做这种搜索类的题目时应该仔细想想是否有重复,避免走弯路。
欢迎指正。

猜你喜欢

转载自blog.csdn.net/hu694028833/article/details/79209567
今日推荐