思路:动态规划。dp[m][n]表示是s1[0~m-1]和s2[0~n-1]能否构成s3[0~m+n-1]。那么很显然,递推式是dp[m][n]=((dp[m-1][n]&&s1[m-1]==s3[m+n-1])||(dp[m][n-1]&&s2[n-1]==s3[m+n-1]))。边界条件是dp[0][1~n]和dp[1~m][0]。
注意动态申请内存时的写法,而且空间是N1+1和N2+1。以及判错。
class Solution {
public:bool isInterleave(string s1, string s2, string s3) {
int N1=s1.size();
int N2=s2.size();
int N3=s3.size();
//判错
if(N3!=(N1+N2)) return false;
if(N1==0){
if(s2==s3) return true;
else return false;
}
if(N2==0){
if(s1==s3) return true;
else return false;
}
//init
bool **dp=new bool*[N1+1];
for(int i=0;i<=N1;++i){
dp[i]=new bool[N2+1];
}
bool flag=1;
for(int i=1;i<=N1;++i){
if(flag && s1[i-1]==s3[i-1]){
dp[i][0]=1;
}else{
flag=0;
dp[i][0]=0;
}
}
flag=1;
for(int i=1;i<=N2;++i){
if(flag && s2[i-1]==s3[i-1]){
dp[0][i]=1;
}else{
flag=0;
dp[0][i]=0;
}
}
//process
for(int m=1;m<=N1;++m){
for(int n=1;n<=N2;++n){
dp[m][n]=((dp[m-1][n]&&s1[m-1]==s3[m+n-1])||(dp[m][n-1]&&s2[n-1]==s3[m+n-1]));
}
}
//end
bool result=dp[N1][N2];
for(int i=0;i<=N1;++i){
delete []dp[i];
}
delete []dp;
return result;
}
};