#include <vector> class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param s1 string字符串 * @param s2 string字符串 * @param s3 string字符串 * @return bool布尔型 */ bool isInterleave(string s1, string s2, string s3) { // write code here // 跟 “NB122 交织子序列” 大同小异 int col = s1.size(); int row = s2.size(); int len = s3.size(); if(col+row != len) return false; // s1 = " " + s1; s2 = " " + s2; s3 = " " + s3; vector<vector<int> > dp(row+1,vector<int>(col+1,false)); // 判断是不是s1在前 bool flag = false; // 初始化第一行 for(int j=0; j<=col; ++j) { if(s1[j]==s3[j]) dp[0][j] = true; else break; if(j==col && dp[0][j]) flag = true; } // 初始化第一列 for(int i=0; i<=row; ++i) { if(s2[i]==s3[i]) dp[i][0] = true; else break; } // 外层循环为行,内层循环为列,为了让s1先遍历完 for(int i=1; i<=row; ++i) { for(int j=1; j<=col; ++j) { dp[i][j] = (s1[j]==s3[i+j]&&dp[i][j-1]) || (s2[i]==s3[i+j]&&dp[i-1][j]); // s1已经遍历完了,且s3中有组成s2的全部字符 if(j==col && i<row && dp[i][j]) flag = true; } } return flag && dp[row][col]; } };