Хотя ОП упомянул в качестве запоздалой мысли о том, что в его случае его исходная строка была сортирована, в общем случае входной сигнал Run Length encoding не будет сортироваться, поскольку потеряет информацию и не может быть распакован. Вот взять на более общем случае несортированный:
string str = "aaaaaaaabccccccaadddddaaa"; // a8bc6a2d5a3
// Zip the string with itself, offset by 1 character.
// Duplicate the last char to make strings equal length
var pairs = str
.Zip((str + str.Last()).Skip(1),
(prev, current) => new { prev, current });
// Retain a horrid mutable sequence which tracks consecutive characters
var sequence = 0;
var grps = pairs.GroupBy(p =>
new { Ch = p.prev,
Sequence = p.current == p.prev
? sequence
: sequence++});
// Join this together, using the other solutions to drop the count from single chars
var rle = String.Join("",
grps.Select(g => g.Count() > 1
? g.Key.Ch.ToString() + g.Count().ToString()
: g.Key.Ch.ToString()));
Console.WriteLine(rle);
Edit
Я предполагаю, номерные комментарии указывают на некоторые нарушения POLA, которые требуют объяснения:
- Строка является
Zip
PED с (Skip
), чтобы определить границы последовательных символов
- С
Zip
останавливается на берегу test, последний символ повторяется в кратчайшей строке для обработки конечного символа в строке.
- В отличие от «сортированной» входной строки RLE в других ответах, групповой ключ выполняется комбинацией символа, а «являются соседними символами»? секвенсор.
- Эта последовательность довольно ужасающе увеличивается в пределах условной в проекции лямбда от
GroupBy
- @ Джоунси/@ Тима условно присоединиться используется в
String.Join
собрать окончательную кодированную строку.
Ваш алгоритм неправильно. Что вы получите с 'aaaaaabccccccaaa' –
@ L.B, Извините. Я предполагаю, что это отсортированная строка. –