Interleaving String

来源:互联网 发布:程序员显示器推荐2017 编辑:程序博客网 时间:2024/04/29 22:44

1. 2维 DP。

class Solution {public:    bool isInterleave(string s1, string s2, string s3) {        const int n1 = s1.size();        const int n2 = s2.size();        const int n3 = s3.size();                if(n1 == 0) return s2 == s3;        if(n2 == 0) return s1 == s3;        if(n3 != n1+n2) return false;                vector<vector<bool> > f(n1+1, vector<bool>(n2+1, true));        f[0][0] = true;        for(int i=1; i<=n1; i++)            f[i][0] = f[i-1][0] && s3[i-1] == s1[i-1];                for(int j=1; j<=n2; j++)            f[0][j] = f[0][j-1] && s3[j-1] == s2[j-1];                for(int i=1; i<=n1; i++)        {            for(int j=1; j<=n2; j++)            {                f[i][j] = (f[i-1][j] && s1[i-1] == s3[i+j-1])                    || (f[i][j-1] && s2[j-1] == s3[i+j-1]);            }        }        return f[n1][n2];    }};

2维DP + 滚动数组。

class Solution {public:    bool isInterleave(string s1, string s2, string s3) {        const int n1 = s1.size();        const int n2 = s2.size();        const int n3 = s3.size();                if(n1 == 0) return s2 == s3;        if(n2 == 0) return s1 == s3;        if(n3 != n1+n2) return false;                vector<bool> f(n2+1, true);        f[0] = true;                for(int j=1; j<=n2; j++)            f[j] = f[j-1] && s3[j-1] == s2[j-1];                    for(int i=1; i<=n1; i++)        {            f[0] = f[0] && s3[i-1] == s1[i-1];            for(int j=1; j<=n2; j++)            {                f[j] = (f[j] && s1[i-1] == s3[i+j-1])                    || (f[j-1] && s2[j-1] == s3[i+j-1]);            }        }        return f[n2];    }};
 

0 0