Browse Source

Add 'longest_subsequence.cpp'

master
Archivist 1 year ago
parent
commit
85ebd64fed
1 changed files with 55 additions and 0 deletions
  1. +55
    -0
      longest_subsequence.cpp

+ 55
- 0
longest_subsequence.cpp View File

@ -0,0 +1,55 @@
auto subsequence_boundary(auto start, auto end,auto pred) {
using live_iterator = decltype(start);
using distance_t = std::invoke_result_t<decltype(std::distance<live_iterator>), live_iterator, decltype(end)>;
distance_t distance = std::distance(start, end);
if(distance < 1) {
return start;
}
if(distance == 1) {
return ++start;
}
live_iterator next = start;
++next;
while(not pred(*start, *next)) {
++start;
++next;
if(next == end) return next;
}
return next;
}
auto longest_matching_subsequence(auto start, auto end, auto pred) {
using live_iterator = decltype(start);
using distance_t = std::invoke_result_t<decltype(std::distance<live_iterator>), live_iterator, decltype(end)>;
live_iterator current = start;
struct {
live_iterator best_s;
live_iterator best_e;
} results;
results.best_s = start;
results.best_e = start;
distance_t best_length = 0;
while(current != end) {
live_iterator next = subsequence_boundary(current, end, pred);
distance_t subsequence_length = std::distance(current, next);
if(subsequence_length > best_length) {
results.best_s = current;
results.best_e = next;
best_length = subsequence_length;
}
current = next;
}
return results;
}
TEST_CASE("Subsequence") {
std::vector<int> list = {0,1,2,3,4,5,0,1,0,2,5,8,7};
auto [s,e] = longest_matching_subsequence(list.begin(), list.end(), std::greater<int>{});
REQUIRE(std::distance(s,e) == 6);
}

Loading…
Cancel
Save