您的位置:首页 > 其它

97.Interleaving String

2015-05-19 00:10 211 查看
思路:动态规划。dp[m]
表示是s1[0~m-1]和s2[0~n-1]能否构成s3[0~m+n-1]。那么很显然,递推式是dp[m]
=((dp[m-1]
&&s1[m-1]==s3[m+n-1])||(dp[m][n-1]&&s2[n-1]==s3[m+n-1]))。边界条件是dp[0][1~n]和dp[1~m][0]。

注意动态申请内存时的写法,而且空间是N1+1和N2+1。以及判错。

class Solution {

public:

    bool isInterleave(string s1, string s2, string s3) {

        int N1=s1.size();

        int N2=s2.size();

        int N3=s3.size();

        //判错

        if(N3!=(N1+N2)) return false;

        if(N1==0){

            if(s2==s3) return true;

            else return false;

        }

        if(N2==0){

            if(s1==s3) return true;

            else return false;

        }

        

        //init

        bool **dp=new bool*[N1+1];

        for(int i=0;i<=N1;++i){

            dp[i]=new bool[N2+1];

        }

        bool flag=1;

        for(int i=1;i<=N1;++i){

            if(flag && s1[i-1]==s3[i-1]){

                dp[i][0]=1;

            }else{

                flag=0;

                dp[i][0]=0;

            }

        }

        flag=1;

        for(int i=1;i<=N2;++i){

            if(flag && s2[i-1]==s3[i-1]){

                dp[0][i]=1;

            }else{

                flag=0;

                dp[0][i]=0;

            }

        }

        //process

        for(int m=1;m<=N1;++m){

            for(int n=1;n<=N2;++n){

                dp[m]
=((dp[m-1]
&&s1[m-1]==s3[m+n-1])||(dp[m][n-1]&&s2[n-1]==s3[m+n-1]));

            }

        }

        //end

        bool result=dp[N1][N2];

        for(int i=0;i<=N1;++i){

            delete []dp[i];

        }

        delete []dp;

        return result;

    }

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: