您的位置:首页 > 其它

[LeetCode]Interleaving String

2013-05-29 19:42 393 查看
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

class Solution {
//solution 1: DFS, it is straight forward every character in s3
//comes from either s1 or s2, but it is time-consuming
//solution 2: DP. define f[i][j]: if s3(1, i+j) interleaved by s1(1,i) s2(1,j)?
//(1)than the transform equation is below:
//if s1[i] == s3[i+j], f[i][j] = f[i-1][j]
//if s2[j] == s3[i+j], f[i][j] = f[i][j-1]
//(2)the initialize is below :
//f[0][0] = true,
//f[i][0] = f[i-1][0] && (s1[i-1] == s3[i-1]);
//f[0][j] = f[0][j-1] && (s2[j-1] == s3[j-1]);
public:
bool isInterleave(string s1, string s2, string s3) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
return DP(s1, s2, s3);
}

bool DP( string s1, string s2, string s3 )
{
int n1 = s1.size();
int n2 = s2.size();
if(n1+n2 != s3.size())
return false;
//init
vector<vector<bool>> f(n1+1, vector<bool>(n2+1, false));
f[0][0] = true;
for(int i = 1; i <= n1; ++i)
f[i][0] = f[i-1][0] && (s1[i-1] == s3[i-1]);
for(int j = 1; j <= n2; ++j)
f[0][j] = f[0][j-1] && (s2[j-1] == s3[j-1]);
//transform
for (int i = 1; i <= n1; ++i)
{
for (int j = 1; j <= n2; ++j)
{
if(s1[i-1] == s3[i+j-1])
f[i][j] = f[i][j] || f[i-1][j];
if(s2[j-1] == s3[i+j-1])
f[i][j] = f[i][j] || f[i][j-1];
}
}
return f[n1][n2];
}

};

second time

class Solution {
public:
bool isInterleave(string s1, string s2, string s3) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int n1 = s1.size();
int n2 = s2.size();
if(n1+n2 != s3.size()) return false;
vector<vector<bool> > f(n1+1, vector<bool>(n2+1, false));
f[0][0] = true;
for(int i = 0; i <= n1; ++i)
{
for(int j = 0; j <= n2; ++j)
{
int len = i+j;
if(i >= 1 && s1[i-1] == s3[len-1]) f[i][j] = f[i][j] || f[i-1][j];
if(j >= 1 && s2[j-1] == s3[len-1]) f[i][j] = f[i][j] || f[i][j-1];
}
}
return f[n1][n2];
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: