Skip to content

Instantly share code, notes, and snippets.

@xiaosuo
Last active May 2, 2017 02:21
Show Gist options
  • Select an option

  • Save xiaosuo/5762e41ada08b721fcb6cf47d043561d to your computer and use it in GitHub Desktop.

Select an option

Save xiaosuo/5762e41ada08b721fcb6cf47d043561d to your computer and use it in GitHub Desktop.
lcs
#include <iostream>
#include <string>
using namespace std;
static ssize_t *memory = nullptr;
size_t lcs(const string &s1, const std::string &s2, size_t i1, size_t i2) {
if (!memory) {
size_t size = (s1.size() + 1) * (s2.size() + 1);
memory = new ssize_t[(s1.size() + 1) * (s2.size() + 1)];
for (size_t i = 0; i < size; ++i) {
memory[i] = -1;
}
}
size_t i = i1 * (s2.size() + 1) + i2;
if (memory[i] != -1) {
return memory[i];
}
if (i1 == 0 || i2 == 0) {
memory[i] = 0;
} else if (s1[i1 - 1] == s2[i2 - 1]) {
memory[i] = 1 + lcs(s1, s2, i1 - 1, i2 -1);
} else {
memory[i] = max(lcs(s1, s2, i1 - 1, i2), lcs(s1, s2, i1, i2 - 1));
}
return memory[i];
}
int main() {
string s1, s2;
cin >> s1;
cin >> s2;
cout << lcs(s1, s2, s1.size(), s2.size()) << endl;
for (size_t i1 = 0; i1 <= s1.size(); ++i1) {
for (size_t i2 = 0; i2 <= s2.size(); ++i2) {
cout << memory[i1 * (s2.size() + 1) + i2] << ' ';
}
cout << endl;
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment