// Author: Huahua
// Running time: 20 ms
class Solution {
public:
int minimumDeleteSum(string s1, string s2) {
const int l1 = s1.length();
const int l2 = s2.length();
m_ = vector<vector<int>>(l1 + 1, vector<int>(l2 + 1, INT_MAX));
return dp(s1, l1, s2, l2);
}
private:
int dp(const string& s1, int i, const string& s2, int j) {
if (i == 0 && j == 0) return 0;
if (m_[i][j] != INT_MAX) return m_[i][j];
if (i == 0) // s1 is empty.
return m_[i][j] = dp(s1, i, s2, j - 1) + s2[j - 1];
if (j == 0) // s2 is empty
return m_[i][j] = dp(s1, i - 1, s2, j) + s1[i - 1];
if (s1[i - 1] == s2[j - 1]) // skip s1[i-1] / s2[j-1]
return m_[i][j] = dp(s1, i - 1, s2, j - 1);
return m_[i][j] = min(dp(s1, i - 1, s2, j) + s1[i - 1], // del s1[i-1]
dp(s1, i, s2, j - 1) + s2[j - 1]); // del s2[j-1]
}
vector<vector<int>> m_;
};