题目考察的知识点:动态规划

本题解析所用的编程语言:c++

动态规划解法:构造一个(m+1)*(n+1)的dp数组,dp[i][j]表示的是s[1,i]及x[1,j]区间的字符串能否拼接凑成t[1,i+j]区间内的字符串;然后根据最后一个位置分情况讨论

    bool isInterleave(string s, string x, string t)
    {
        // write code here
        int m = s.size(), n = x.size();
        if (m + n != t.size())
            return false;
        s = ' ' + s, x = ' ' + x, t = ' ' + t;//也可以不用加' ',只不过将s、x、t字符串与dp数组对应起来;
	  										  //不加' ',只需将s[i]等改为是s[i-1]即可

        vector<vector<bool>> dp(m + 1, vector<bool>(n + 1));
        dp[0][0] = true;
        for (int j = 1; j <= n; ++j) //初始化第一行
            if (x[j] == t[j])
                dp[0][j] = true;
            else
                break;
        for (int i = 1; i <= m; ++i) //初始化第一列
            if (s[i] == t[i])
                dp[i][0] = true;
            else
                break;
                
        for (int i = 1; i <= m; ++i)
            for (int j = 1; j <= n; ++j)
                dp[i][j] = (s[i] == t[i + j] && dp[i - 1][j])
                        || (x[j] == t[i + j] && dp[i][j - 1]);
        
        return dp[m][n];
    }

错误解法:

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @param x string字符串 
     * @param t string字符串 
     * @return bool布尔型
     */
    bool isInterleave(string s, string x, string t)
    {
        // write code here
        int i = 0, j = 0, k = 0;
        for (k = 0; k < t.size(); ++k)
        {
            if (s[i] == t[k])
                ++i;
            else if (x[j] == t[k])
                ++j;
            else  
                break;
        }

        if (i == s.size() && j == x.size() && k == t.size())
            return true;
        else
            return false;
    }
};