Nieciekawy błąd. Pod koniec wypisujesz '\0', którego nie widać na konsoli, ale spojowi się nie zgadza wynik. Z takim quick-fixem zadziała:
if (i < input.size())
str += input[i];
A co do kodu to jest brzydki i bliżej mu do C niż C++.
if ((i != 0 && i != (input.length() - 1))
&&
(input[i] == input[i + 1] && input[i] == input[i - 1]))
to jest po prostu brzydkie. Sprawdzanie w każdym obiegu pętli czy nie jesteśmy na początku lub końcu.
for (;; count++) {
if (input[i + count] != input[i])
break;
}
Korzystaj z gotowych algorytmów. Nie pisz wszystkiego samemu. To aż prosi się o wykorzystanie find_if lub input.find_first_not_of.
str.append(std::to_string(count + 1));
Lepiej użyć stringstream:
stringstream out;
...
out << count << input[i];
...
return out.str();
No i zwiększanie iteratora "i" w kilku miejscach sprawia, że bardzo ciężko się ten kod analizuje.
Tak widzę to ja:
std::string my_reduce2(const std::string& str) {
std::stringstream out{};
for (auto it = str.begin(); it != str.end();)
{
auto next_seq_start = std::find_if(it, str.end(), [it](char c) {return c != *it; });
auto dist = std::distance(it, next_seq_start);
if (dist > 2) {
out << *it << dist;
}
else {
out << std::string(dist, *it);
}
it = next_seq_start;
}
return out.str();
}