LeetCode--97. Interleaving String

【题目】
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()];
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值