您的位置:首页 > 其它

[LeetCode] Interleaving String 解题思路

2015-12-17 00:11 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.

问题 : 给定三个字符串 s1, s2, s3, 求 s3 是不是由 s1 和 s2 交错组合而成。

感觉是一条比较典型的 DP 题目。

设 i, j, k 分别是 s1, s2, s3 待求解的当前下标。

当 s3[k] != s1[i] 且 s3[k] != s2[j], 则匹配失败

当 s3[k] 只和 s1[i] 相等,则 k++ 和 i++

当 s3[k] 只和 s2[j] 相等,则 k++ 和 j++

当 s3[k] == s1[i] 且 s3[k] == s2[j] ,则分别求 k++ 和 i++ ,以及 k++ 和 j++ ,两者取或运算

由于 s3 恰好有 s1 和 s2 交错行程,所以 s3 长度必然等于 s1 + s2 的长度,知道其中二者就能确定第三个数,这样只需要二维数组保存中间结果即可。

vector<vector<int>> vv;

bool interIleave(string s1, string s2, string s3, int p1, int p2, int p3){

//     cout << s1 << "\n" << s2 << "\n" << s3 << "\n--------\n";

if (s1.size() == 0) {
return (s2 == s3);
}

if (s2.size() == 0) {
return (s1 == s3);
}

if (vv[p1][p3] != -1) {
return vv[p1][p3];
}

if (s3[0] != s1[0] && s3[0] != s2[0]) {
vv[p1][p3] = false;
return false;
}

if (s3[0] == s1[0] && s3[0] != s2[0]) {
bool tmpb = interIleave(s1.substr(1), s2, s3.substr(1), p1+1, p2, p3+1);
vv[p1][p3] = tmpb;
return tmpb;
}

if (s3[0] != s1[0] && s3[0] == s2[0]) {
bool tmpb = interIleave(s1, s2.substr(1), s3.substr(1), p1, p2+1, p3+1);
vv[p1][p3] = tmpb;
return tmpb;
}

bool inter1 = interIleave(s1.substr(1), s2, s3.substr(1), p1+1, p2, p3+1);
bool inter2 = interIleave(s1, s2.substr(1), s3.substr(1), p1, p2+1, p3+1);
bool res = inter1 || inter2;

vv[p1][p3]    = res;

return res;
}

bool isInterleave(string s1, string s2, string s3) {

vector<vector<int>> tmp(s1.size(), vector<int>(s3.size(), -1));
vv = tmp;

if (s3.size() != s1.size()+s2.size()) {
return false;
}

if (s3.size() == 0) {
return true;
}

bool res = interIleave(s1, s2, s3, 0, 0, 0);

return res;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: