LeetCode 97. Interleaving String

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;
}


你可能感兴趣的:(LeetCode 97. Interleaving String)