动态规划-----两个字符串交叉组成第三个字符

来源:互联网 发布:泾川县门户网通知公告 编辑:程序博客网 时间:2024/05/04 15:05

题目:Givens1 ,s2 , s3 , find whethers3 is formed by the interleaving ofs1 ands2 .

For example,

Given:

s1 ="aabcc" ,

s2 ="dbbca" ,

Whens3 ="aadbbcbcac" , return true.

Whens3 ="aadbbbaccc" , return false.

 

“When you see string problem that is about subsequenceor matching, dynamic programming method should come to your mind naturally.”-----看到字符串操作,首先应该想到DP算法。

大体思路是,s1取一部分s2取一部分,最后是否能匹配s3

动态规划数组是dp[i][j],表示: s1取前i位(但是第i为之前的字符串也必须是构成s3的),s2取前j位(但是第J位之前的字符串也必须是构成s3的),是否能组成s3的前i+j位。

初始化是,假设s1为空,那么s2每一位跟s3匹配放入dp[0][j];假设s2为空,那么s1每一位跟s3匹配放入dp[i][0]

 

 

相似题目:

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的为可行。最终返回右下角。

矩阵中红色的数值1表示dp[s1==0][s2==1]是构成s3的,所以1表示true.

 

     0  a  b

0   1  1 0

a   1  1  1

a   1  0  1

这个数组就是dp[i][j]的取值。

class Solution
{
public:
bool isInterleave(string s1,string s2,string s3)
{
int m=s1.size(),n=s2.size();
if(m+n!=s3.size())return false;
vector<vector<bool>>dp(m+1);
for(int i=0;i<=m;i++)
dp[i].resize(n+1);
dp[0][0]=true;
int i=1,j=1;
while(i<=m&&s1[i-1]==s3[i-1])dp[i++][0]=true;
while(j<=n&&s2[j-1]==s3[j-1])dp[0][j++]=true;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
if(dp[i-1][j]&&s1[i-1]==s3[i+j-1]||dp[i][j-1]&&s2[j-1]==s3[i+j-1])
dp[i][j]=true;
return dp[m][n];
}
}; 
                



0 0
原创粉丝点击