三个字符串s1,s2,s3,判断s3是前两个字符串交织所得例如:
s1="aabcc"
,s2="dbbca"
,
When s3 = "aadbbcbcac"
, return true.
When s3 = "aadbbbaccc"
, return false.
思路:
本题也是一个多层问题返回单值,故引入动态规划,由于是针对两个字符串,故引入二维数组dp[i][j],二维数组dp[i][j]=1表示s3匹配s1或者s2,dp[i][j]=0表示不匹配。
示例:s1="aa",s2="ab",s3="aaba"。标1的为可行。最终返回右下角。
0 a b
0 1 1 0
a 1 1 1
a 1 0 1
注意递归数组是从(0,0)开始,s1与s2真正对应二维数组下标关系:二维数组的第j列==s2[j-1],二维数组的第i行==s1[i-1],若dp[i][j]=1,则s1[i-1]或者s2[j-1]满足s3[i+j-1]。故当s1到达第i个元素,s2到达第j个元素,若dp[i][j]=1:
有可能是原始位置向右所得,此时s2[j-1]匹配s3[i+j-1]
有可能是原始位置向下所得,此时s1[i-1]匹配s3[i+j-1]
故递推关系如下:
dp[0][0]=1,初始位置,
dp[i][j]=dp[i][j-1]&(s2[j-1]==s3[i+j-1]) when i==0
dp[i][j]=dp[i-1][j]&(s1[i-1]==s3[i+j-1]) when j==0
dp[i][j]=dp[i][j-1]&(s2[j-1]==s3[i+j-1])||dp[i-1][j]&(s1[i-1]==s3[i+j-1]),others
代码:
bool isInterleave(string s1,string s2,string s3){
int m=s1.size();int n=s2.size();
if(m+n!=s3.size())return 0;
vector< vector<bool> > dp(m+1,vector<bool>(n+1,0));
for(int i=0;i<=m;i++)
for(int j=0;j<=n;j++)
{
if(i==0&&j==0)dp[i][j]=1;//初始位置
else if(i==0)
dp[i][j]=dp[i][j-1]&(s2[j-1]==s3[i+j-1]);
else if(j==0)
dp[i][j]=dp[i-1][j]&(s1[i-1]==s3[i+j-1]);
else
dp[i][j]=dp[i][j-1]&(s2[j-1]==s3[i+j-1])||dp[i-1][j]&(s1[i-1]==s3[i+j-1]);;
}
return dp[m][n];
}