CS153/hw6/oatprograms/lcs.oat

44 lines
991 B
Text
Raw Normal View History

/**
* Computes longest common subsequence of two strings a and b.
*/
global buf = new int[]{0};
string lcs(int i, int j, string a, string b) {
if (i < 0 | j < 0) {
return "";
}
var a_chars = array_of_string(a);
var b_chars = array_of_string(b);
var last_char_a = a_chars[i];
var last_char_b = b_chars[j];
if (last_char_a == last_char_b) {
var prev_lcs = lcs(i - 1, j - 1, a, b);
buf[0] = a_chars[i];
var next_char = string_of_array(buf);
return string_cat(prev_lcs, next_char);
}
var left_lcs = lcs(i, j - 1, a, b);
var right_lcs = lcs(i - 1, j, a, b);
var left_len = length_of_string(left_lcs);
var right_len = length_of_string(right_lcs);
if (left_len < right_len) {
return right_lcs;
} else {
return left_lcs;
}
}
int program(int argc, string[] argv) {
var tomato = "TOMATO";
var orating = "ORATING";
print_string(lcs(5, 6, tomato, orating));
return 0;
}