Interleaving String

来源:互联网 发布:淘宝开网店哪里进货 编辑:程序博客网 时间:2024/05/16 00:27

原题如下:
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.

思路:
可以考虑用动态规划的思想解决这个问题,动态规划的关键在于找到或者构建状态转移方程。针对此题,可以用dp[i][j]表示s1[0~i]&s2[0~j]组成的字符串,是否能组成s3[0,i+j]。

dp[i][j] 的上一个状态包含两种情况:

dp[i-1][j], 此时是s[i-1]应该等于s[i-1+j]
dp[i][j-1], 此时是s[i-1]应该等于s[i+j-1]

这两种状态看起来简单,但是理解起来可能不是那么直观,有兴趣的读者可以在纸上画出一个矩阵出来,然后根据题目中的case走一遍,找找感觉。
其中dp是一个[s1.length()+1][s2.length()+1]的矩阵,如果s3能够被s1和s2交叉表示,那么dp的的右下角的元素dp[s1.length()][s2.length()]肯定等于true,返回其值即可。

C++可以AC的代码如下:

   bool isInterleave(string s1, string s2, string s3) {        int m, n;        m = s1.length();        n = s2.length();        if((m + n) != s3.length())            return false;        bool **dp = new bool*[m+1];        for(int i=0; i<m+1; i++){            dp[i] = new bool[n+1];            for(int j=0; j<n+1; j++)               dp[i][j] = false;        }        dp[0][0] = true;        for(int i=0; i<m+1; i++){            for(int j=0; j<n+1; j++){                if(j>0 && s3[i+j-1] == s2[j-1] && dp[i][j-1]){                    dp[i][j] = true;                }else if(i>0 && s3[i-1 + j] == s1[i-1] &&dp[i-1][j]){                    dp[i][j] = true;                }            }        }        return dp[m][n];    }
0 0