/*/ problem source: * https://www.geeksforgeeks.org/find-the-longest-substring-with-k-unique-characters-in-a-given-string/ */ #include #include #include #include class result { public: unsigned long longest_start = 0; unsigned long longest_end = 0; bool match_found = false; bool operator==(const result r) { return longest_start == r.longest_start && longest_end == r.longest_end && match_found == r.match_found; }; }; struct input { std::string s; unsigned long k; }; struct test_case { input i; result r; }; result find(const std::string &s, const unsigned long k) { result r; std::unordered_map char_count; unsigned long start = 0, end = 0; for (; end < s.length(); end++) { char_count[s[end]] += 1; while (char_count.size() > k) { char_count[s[start]]--; if (char_count[s[start]] == 0) { char_count.erase(s[start]); } start++; } if (char_count.size() == k && end - start > r.longest_end - r.longest_start) { r.longest_start = start, r.longest_end = end; r.match_found = true; } } if (r.match_found) { std::cout << "Longest substring is \"" << s.substr(r.longest_start, r.longest_end - r.longest_start + 1) << "\" with length " << r.longest_end - r.longest_start + 1 << ".\n"; } else { std::cout << "Could not find any match, not enough unique characters.\n"; } return r; } int main() { std::vector test_cases = {{{"aabacbebebe", 3}, {4, 10, true}}, {{"aabbcc", 1}, {0, 1, true}}, {{"aabbcc", 3}, {0, 5, true}}, {{"aaabbb", 3}, {0, 0, false}}}; for (const test_case &t : test_cases) { if (find(t.i.s, t.i.k) == t.r) { std::cout << "Test case with string \"" << t.i.s << "\" and k=" << t.i.k << " passed.\n"; } else { std::cout << std::flush; std::cerr << "TEST CASE WITH STRING \"" << t.i.s << "\" AND k=" << t.i.k << " FAILED.\n"; } } return 0; }