您的位置:首页 > 其它

97. Interleaving String

2016-11-07 21:29 239 查看
Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2.

For example,

Given:

s1 = “aabcc”,

s2 = “dbbca”,

When s3 = “aadbbcbcac”, return true.

When s3 = “aadbbbaccc”, return false.

第一种方法:递归回溯,但是超时了

class Solution {
public:
bool isInterleave(string s1, string s2, string s3)
{
if(s1.size()==0)  return s2==s3;
if(s2.size()==0)  return s1==s3;
if(s3.size()==0)  return s1.size()+s2.size()==0;

if(s1[0]!=s3[0]&&s2[0]!=s3[0])
return false;
else if(s1[0]==s3[0]&&s2[0]!=s3[0])
return isInterleave(s1.substr(1),s2,s3.substr(1));
else if(s1[0]!=s3[0]&&s2[0]==s3[0])
return isInterleave(s1,s2.substr(1),s3.substr(1));
else
return isInterleave(s1,s2.substr(1),s3.substr(1))||isInterleave(s1.substr(1),s2,s3.substr(1));
}
};


第二种方法:动态规划,二维动态规划

s1, s2只有两个字符串,因此可以展平为一个二维地图,判断是否能从左上角走到右下角。

当s1到达第i个元素,s2到达第j个元素:

地图上往右一步就是s2[j-1]匹配s3[i+j-1]。

地图上往下一步就是s1[i-1]匹配s3[i+j-1]。

示例:s1=”aa”,s2=”ab”,s3=”aaba”。标1的为可行。最终返回右下角。

0 a b

0 1 1 0

a 1 1 1

a 1 0 1

class Solution {
public:
bool isInterleave(string s1, string s2, string s3)
{
int m=s1.size();
int n=s2.size();
if(m+n!=s3.size())
return false;
vector<vector<bool> >ret(m+1,vector<bool>(n+1,false));
ret[0][0]=true;
int i,j;
for(i=1;i<=m;i++)
ret[i][0]=ret[i-1][0]&&(s1[i-1]==s3[i-1]);
for(j=1;j<=n;j++)
ret[0][j]=ret[0][j-1]&&(s2[j-1]==s3[j-1]);
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
{
ret[i][j]=(ret[i-1][j]&&(s1[i-1]==s3[i+j-1]))||(ret[i][j-1]&&(s2[j-1]==s3[i+j-1]));
}
return ret[m]
;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二维动态规划