leetcode Interleaving String

Given s1s2s3, 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.

使用动态规划,思路如下:

这是一个二维的动态规划,如s1长len1,s2长len2,建立一个(len1+1)*(len2+1)的bool数组,元素均初始化false

F[i][j]代表 s3[i+j-1] 与 s1[0]~s1[i-1]、s2[0]~s2[j] 或 s1[0]~s1[i]、s2[0]~s2[j-1] 是否满足题中条件,判断其为true还是false的条件就是 F[i-1][j] 为 true 且 s3[i-1+j] == s1[i-1],或者 F[i][j-1] 为 true 且 s3[i+j-1] == s2[j-1]。

true    ; (i=0 && j=0)

F[i][j] = {

F[i-1][j] && (s1[i-1] == s3[i-1+j]) || F[i][j-1] && (s2[j-1] == s3[i+j-1]) ;(i>0 || j>0)

代码如下:

class Solution {
public:
    bool isInterleave(string s1, string s2, string s3) {
		int len1 = s1.length(), len2 = s2.length(), len3 = s3.length();
		if(len3 != len1+len2)
			return false;
		vector<vector<bool> >Tmp(len1+1, vector<bool>(len2+1, false));
		//初始化Tmp[0][0]为true
		bool tmp1 ,tmp2;
		for(int i=0; i<=len1; ++i)
		{
			for(int j=0; j<=len2; ++j)
			{
				tmp1 = false;
				tmp2 = false;
				if(i == 0 && j == 0)
				{
					Tmp[i][j] = true;
					continue;
				}
				if(i > 0)
					tmp1 = Tmp[i-1][j] && (s1[i-1] == s3[i-1+j]);
				if(j > 0)
					tmp2 = Tmp[i][j-1] && (s2[j-1] == s3[i+j-1]);
				Tmp[i][j] = tmp1 || tmp2;
			}
		}
		return Tmp[len1][len2];
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值