Leetcode 97. Interleaving String

来源:互联网 发布:qq飞车s车时空战舰数据 编辑:程序博客网 时间:2024/05/23 01:17

97. Interleaving String

三个字符串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]);    elsedp[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];}



0 0
原创粉丝点击