您的位置:首页 > 其它

LeetCode 97. Interleaving String

2016-04-18 09:20 375 查看
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.

I usually want to find a DP equation first, just recently realized that IT'S BETTER TO

first formalize a backtracking version and then memorize the intermediate value using tables (same idea as Compilers??)



DP is to memory the repetitive intermediate values for later use. The essence however, is backtracking, backtracking, backtracking....

#include <string>
#include <iostream>
#include <vector>
using namespace std;

bool isInterLeave(string s1, int i, string s2, int j, string s3, int k) {
if(i == s1.size() && j == s2.size() && k == s3.size()) return true;
if((s3[k] != s1[i]) && (s3[k] != s2[j])) return false;
return (isInterLeave(s1, i + 1, s2, j, s3, k + 1) && (s1[i] == s3[k])) || (isInterLeave(s1, i, s2, j + 1, s3, k + 1) && (s2[j] == s3[k]));
}

bool isInterLeave(string s1, string s2, string s3) {
if(s3.size() != (s1.size() + s2.size())) return false;
int i = 0, j = 0, k = 0;
return isInterLeave(s1, i, s2, j, s3, k);
}    // First backtracking version.

// Table to memory the intermediate results.
bool isInterLeaveII(string s1, string s2, string s3) {
int n1 = s1.size();
int n2 = s2.size();
int n3 = s3.size();

if(n1 + n2 != n3) return false;

vector< vector<bool> > dp(n1 + 1, vector<bool>(n2 + 1, false));
dp[0][0] = true;
for(int i = 1; i <= n1; ++i) dp[i][0] = (dp[i-1][0] && s1[i-1] == s3[i-1]);
for(int j = 1; j <= n2; ++j) dp[0][j] = (dp[0][j-1] && s2[j-1] == s3[j-1]);

for(int i = 1; i <= n1; ++i) {
for(int j = 1; j <= n2; ++j) {
dp[i][j] = (dp[i-1][j] && s1[i-1] == s3[i + j - 1] || dp[i][j-1] && s2[j-1] == s3[ i + j - 1]);
}
}
return dp[n1][n2];
}

int main(void) {
cout << isInterLeaveII("aabcc", "dbbca", "aadbbcbcac") << endl;
cout << isInterLeaveII("ac", "b", "acc") << endl;
cout << isInterLeaveII("ac", "b", "abc") << endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: