interleaving-string

来源:互联网 发布:js判断哪个tr被双击 编辑:程序博客网 时间:2024/05/19 17:23

题目:

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.

程序:

递归(超时)

class Solution {public:    bool isInterleave(string s1, string s2, string s3) {        if ((s1.size() + s2.size()) != s3.size())            return false;        bool flag = false;        solve(s1, s2, s3,flag);        return flag;    }    void solve(string s1, string s2, string s3,bool &flag)    {        if (s3.size() == 0 && s1.size() == 0 && s2.size() == 0)        {            flag=true;            return;        }        if (s1.size() == 0)        {            if (s2 == s3)            {                flag = true;                return;            }            else            {                return;            }        }        if (s2.size() == 0)        {            if (s1 == s3)            {                flag = true;                return;            }            else            {                return;            }        }        if (s1[0] == s3[0])            solve(s1.substr(1), s2, s3.substr(1),flag);        if (s2[0] == s3[0])            solve(s1, s2.substr(1), s3.substr(1),flag);    }};

方法二:

动态规划

class Solution {public:    // dp[i][j]  使用s1[0,1,...,i]字符串和s2[0,1,2,...,j]字符串,组合成s3(i+j)    bool isInterleave(string s1, string s2, string s3)   {    int m=s1.length(),n=s2.length(),l=s3.length();   if(m+n != l)        return false;   vector<vector<bool> > dp(m+1,vector<bool>(n+1,false));   dp[0][0] = true;   for(int i=1;i<=m;i++)      dp[i][0] =  dp[i-1][0] && s1[i-1] == s3[i-1];   for(int j=1;j<=n;j++)      dp[0][j] = dp[0][j-1] && s2[j-1] == s3[j-1];   for(int i=1;i<=m;i++)   {       for(int j=1;j<=n;j++)       {           dp[i][j] = (dp[i-1][j] && s1[i-1] == s3[i+j-1]) ||                      (dp[i][j-1] && s2[j-1] == s3[i+j-1]);       }   }   return dp[m][n];    }};
原创粉丝点击