Interleaving String

来源:互联网 发布:柏拉图软件好玩吗 编辑:程序博客网 时间:2024/05/02 07:47

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.

不多说,dp,f(i,j)表示s1的前i个字符,s2的前j个字符是否能组成目标字符串的前i+j个字符

方便coding,f(i,j)的下标从1开始计数

即f(1,0)表示s1的第一个字符组成的字符串

f(0,1)表示s2的第一个字符组成的字符串

if s1[i]==s3[i+j] , f(i,j) = f(i-1,j)

if s2[j]==s3[i+j] , f(i,j) = f(i,j-1)

最终返回f(m,n) 其中m代表字符串s1的长度,n代表字符串s2的长度。

class Solution {public:    bool isInterleave(string s1, string s2, string s3) {        if(s1.length()+s2.length()!=s3.length())            return false;        int len1 = s1.length();        int len2 = s2.length();        int len3 = s3.length();        if(len1==0)            return s2==s3;        if(len2==0)            return s1==s3;        bool **f = new bool*[len1+1];        for(int i=0;i<=len1;i++){            f[i] = new bool[len2+1];            for(int j=0;j<=len2;j++)                f[i][j] = false;        }        if(s1[0]==s3[0])            f[1][0] = true;        if(s2[0]==s3[0])            f[0][1] = true;        if(!f[0][1] && !f[1][0])            return false;        for(int i=0;i<=len1;i++){            for(int j = 0;j<=len2;j++){                if(i==0 && j==0)                    continue;                else{                    if(i>0){                        if(s3[i+j-1]==s1[i-1] && f[i-1][j])                            f[i][j] = true;                    }                    if(j>0){                        if(s3[i+j-1]==s2[j-1] && f[i][j-1])                            f[i][j] = true;                    }                }            }        }        return f[len1][len2];    }};

ac



0 0