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即可