LeetCode Interleaving String

Interleaving String

Given s1, s2, s3, find whether s3 is formed by the interleaving ofs1 ands2.

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(s3.size() != (s1.size() + s2.size()))
			return false;
		vector<vector<bool> > matrix(s1.size() + 1, vector<bool>(s2.size() + 1));
		matrix[0][0] = true;
		for(int i = 1; i <= s1.size(); ++i)
			matrix[i][0] = matrix[i-1][0] && s1.at(i-1) == s3.at(i-1);
		for(int i = 1; i <= s2.size(); ++i)
			matrix[0][i] = matrix[0][i-1] && s2.at(i-1) == s3.at(i-1);
		for(int i = 1; i <= s1.size(); ++i)
		{
			for(int j = 1; j <= s2.size(); ++j)
			{
				if(matrix[i-1][j] && s1.at(i-1) == s3.at(i+j-1))
					matrix[i][j] = true;
				else if(matrix[i][j-1] && s2.at(j-1) == s3.at(i+j-1))
					matrix[i][j] = true;
				else if(matrix[i-1][j-1])
				{
					if(s1.at(i-1) == s3.at(i+j-2) && s2.at(j-1) == s3.at(i+j-1))
						matrix[i][j] = true;
					else if(s2.at(j-1) == s3.at(i+j-2) && s1.at(i-1) == s3.at(i+j-1))
						matrix[i][j] = true;
				}
				else
					matrix[i][j] = false;
			}
		}
		return matrix[s1.size()][s2.size()];
    }
};

把上面的代码整理一下!
class Solution {
public:
    bool isInterleave(string s1, string s2, string s3) {
    	if(s3.size() != (s1.size() + s2.size()))
			return false;
		vector<vector<bool> > matrix(s1.size() + 1, vector<bool>(s2.size() + 1));
		matrix[0][0] = true;
		for(int i = 1; i <= s1.size(); ++i)
			matrix[i][0] = matrix[i-1][0] && s1.at(i-1) == s3.at(i-1);
		for(int i = 1; i <= s2.size(); ++i)
			matrix[0][i] = matrix[0][i-1] && s2.at(i-1) == s3.at(i-1);

		for(int i = 1; i <= s1.size(); ++i)
		{
			for(int j = 1; j <= s2.size(); ++j)
			{
				matrix[i][j] = (matrix[i-1][j] && s1.at(i-1) == s3.at(i+j-1))
							|| (matrix[i][j-1] && s2.at(j-1) == s3.at(i+j-1))
							|| (matrix[i-1][j-1]) && 
							   (s1.at(i-1) == s3.at(i+j-2) && s2.at(j-1) == s3.at(i+j-1))
							|| (matrix[i-1][j-1]) && 
							   (s2.at(j-1) == s3.at(i+j-2) && s1.at(i-1) == s3.at(i+j-1));
			}
		}
		return matrix[s1.size()][s2.size()];
    }
};


上次写的搜索版本的。
class Solution {
public:
    bool isInterleave(string s1, string s2, string s3) {
		vector<vector<int> > matrix(s1.size());
		for(int i = 0; i < s1.size(); ++i)
		{
			matrix[i].resize(s2.size());
			for(int j = 0; j < s2.size(); ++j)
			matrix[i][j] = 0;
		}
		return isInter(s1.c_str(), 0, s2.c_str(), 0, s3.c_str(), 0, matrix);
   }
	bool isInter(const char* s1, int i1, const char* s2, int i2, const char* s3, int i3, vector<vector<int> >& matrix)
	{
		if(0 == *s1)
		{
			while(0 != *s2 && *s2 == *s3)
			{
				++s2;
				++s3;
			}
			if(0 == *s2 && 0 == *s3)
				return true;
			else
				return false;
		}
		if(0 == *s2)
		{
			while(0 != *s1 && *s1 == *s3)
			{
				++s1;
				++s3;
			}
			if(0 == *s1 && 0 == *s3)
				return true;
			else
				return false;
		}
		if(1 == matrix[i1][i2])
			return false;
		if(*s1 == *s3)
		{
			if(isInter(s1 + 1, i1 + 1, s2, i2, s3 + 1, i3 + 1, matrix))
				return true; 
		}
		if(*s2 == *s3)
		{
			if(isInter(s1, i1, s2 + 1, i2 + 1, s3 + 1, i3 + 1, matrix))
			return true; 
		}

		matrix[i1][i2] = 1;
		return false;
	}
};




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值