LeetCode_Interleaving String

来源:互联网 发布:ubuntu 装在ntfs 编辑:程序博客网 时间:2024/06/18 12:18

Given s1s2s3, 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.

递归解法:超时

class Solution {public:            bool isInterleave(string s1, string s2, string s3)         {             if (s1.length() + s2.length() != s3.length())                return false;                            return isInterleaveDFS(s1, s2, s3, 0, 0, 0);        }                    bool isInterleaveDFS(string &s1, string &s2, string &s3, int p1, int p2, int p3)        {            if (p3 == s3.length())            {                return true;            }            if (p1 < s1.length() && s1[p1] == s3[p3])            {                if (isInterleaveDFS(s1, s2, s3, p1 + 1, p2, p3 + 1))                {                    return true;                }            }            if (p2 < s2.length() && s2[p2] == s3[p3])            {                if (isInterleaveDFS(s1, s2, s3, p1, p2 + 1, p3 + 1))                {                    return true;                }            }            return false;        }};

DP解法:

bool isInterleave2(string s1, string s2, string s3){int len1 = s1.length();int len2 = s2.length();int len3 = s3.length();if (len1 + len2 != len3)return false;bool f[256][256];memset(f, 0, sizeof(bool) * 256 * 256);if (s1[0] == s3[0]){f[1][0] = true;}else{f[1][0] = false;}for (int i = 2; i <= len1; ++i){if (f[i-1][0] && (s1[i-1] == s3[i-1])){f[i][0] = true;}else{f[i][0] = false;}}if (s2[0] == s3[0]){f[0][1] = true;}else{f[0][1] = false;}for (int i = 2; i <= len2; ++i){if (f[0][i-1] && (s2[i-1] == s3[i-1])){f[0][i] = true;}else{f[0][i] = false;}}for (int i = 1; i <= len1; ++i){for (int j = 1; j <= len2; ++j){f[i][j] = false;if (f[i-1][j] == true && s1[i-1] == s3[i+j-1]){f[i][j] = true;}if (f[i][j-1] == true && s2[j-1] == s3[i+j-1]){f[i][j] = true;}}}return f[len1][len2];}