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
        if(s.size()+x.size()!=t.size()){
            return false;  // 如果长度不相等则不是交织序列
        }
        bool dp[s.length()+1][x.length()+1];
        for(int i=0;i<=s.size();++i){
            for(int j=0;j<=x.size();++j){
                dp[i][j]=false;
            }
        }
        dp[0][0]=true;
        for(int i=1;i<=s.length();++i){
            dp[i][0]=(s[i-1]==t[i-1])&&dp[i-1][0];
        }
        for(int j=1;j<=x.size();++j){
            dp[0][j]=(x[j-1]==t[j-1])&&dp[0][j-1];
        }
        for(int i=1;i<=s.size();++i){
            for(int j=1;j<=x.size();++j){
                if((s[i-1]==t[i+j-1])&&dp[i-1][j] || (x[j-1]==t[i+j-1])&&dp[i][j-1]){
                    dp[i][j]=true;
                }
            }
        }
        return dp[s.size()][x.size()];
    }
};
  • 利用动态规划,设置动态二维数组表示s的前i个子串与x的前j个子是否可以构成交织子序列t的前i+j子串;
  • 一定要对动态数组初始化否则会出错;
  • 依次将二维数组的第一行和第一列赋值,判断条件是,s或x的当前字符是否等于t的当前字符以及当前字符之前是否构成交织子序列。
  • 遍历所有情况,若满足条件则赋值true
  • 最后,只要输出最后一个位置的dp即可