您的位置:首页 > 产品设计 > UI/UE

leetcode_question_97 Interleaving String

2013-09-15 22:08 405 查看
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.

Recurse:

Judge Small: Accepted! 

Judge Large: Time Limit Exceeded

bool isInterleave(string s1, string s2, string s3) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if(s1.length() == 0) return s3 == s2;
if(s2.length() == 0) return s3 == s1;
if(s3.length() == 0) return s1.length() + s2.length() == 0;

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 if(s1[0] == s3[0] && s1[0] == s3[0])
return isInterleave(s1.substr(1), s2, s3.substr(1)) || isInterleave(s1, s2.substr(1), s3.substr(1));
else
return false;
}


2-dimension dp:

这是一个二维的动态规划,

s1 = "aabcc"

s2 = "dbbca"

s3 = "aadbbcbcac"



class Solution {
public:
bool dp[101][101];
bool isInterleave(string s1, string s2, string s3) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int size1 = s1.length();
int size2 = s2.length();
int size3 = s3.length();
if( size1 + size2 != size3) return false;

memset(dp, false, sizeof(bool)*101*101);
dp[0][0] = true;
for(int i = 1; i <= size1; ++i)
if(s1[i-1] == s3[i-1]) dp[i][0] = true;
else break;
for(int j = 1; j <= size2; ++j)
if(s2[j-1] == s3[j-1]) dp[0][j] = true;
else break;

int k;
for(int i = 1; i <= size1; ++i)
for(int j = 1; j <= size2; ++j)
{
k = i + j;
if(s1[i-1] == s3[k-1]) dp[i][j] = dp[i-1][j] || dp[i][j];
if(s2[j-1] == s3[k-1]) dp[i][j] = dp[i][j-1] || dp[i][j];
}
return dp[size1][size2];
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息