LeetCode--97. Interleaving String

来源:互联网 发布:聚宝网络 编辑:程序博客网 时间:2024/06/08 16:44

【题目】
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.

【思路】
设S(i)表示长度为i的S3序列是否为S1和S2的交叉队列,D(i + 1)表示S3序列新添加的字符是否等于S1或S2序列新添加的字符,S(i + 1)= S(i) && D(i + 1)。可以得出这是一个动态规划问题,除此之外该问题存在回溯,因此我们用备忘录方法进行解决。设table[i][j]表示S3是否为长度为i的S1和长度为2的S2的交叉队列,得到状态转换方程:
table[i][j] = (table[i][j- 1] && D(i + j)) || (table[i- 1][j] && D(i + j));

【c++代码】

class Solution {public:    bool isInterleave(string s1, string s2, string s3) {        int i = 0, j = 0;        bool table[s1.length() + 1][s2.length() + 1];        if (s3.length() == s1.length() + s2.length())        {            for (; i <= s1.length(); i++)            {                for (j = 0; j <= s2.length(); j++)                {                    if (i == 0 && j == 0)                    {                        table[i][j] = true;                    } else if (i == 0)                    {                        table[0][j] = table[0][j- 1] && (s3[j- 1] == s2[j - 1]);                    } else if (j== 0)                    {                        table[i][0] = table[i- 1][0] && (s3[i - 1] == s1[i - 1]);                    } else                    {                        table[i][j] = (table[i][j - 1] && (s3[i + j - 1] == s2[j - 1])) ||                                                        (table[i - 1][j] && (s3[i + j - 1] == s1[i - 1]));                    }                }            }        }        return table[s1.length()][s2.length()];    }};
0 0
原创粉丝点击