Друзья, публикуем эталонное простое решение (O(n), один проход):
def compress(s: str) -> str:
if not s:
return s
res = []
count = 1
for i in range(1, len(s)):
if s[i] == s[i - 1]:
count += 1
else:
res.append(s[i - 1] + str(count))
count = 1
# последний блок
res.append(s[-1] + str(count))
compressed = "".join(res)
return compressed if len(compressed) < len(s) else s
🧠 Суть решения:
•идём по строке один раз
•считаем подряд идущие символы
•собираем результат в список (не строку — важно для скорости)
•в конце сравниваем длины
def compress(s: str) -> str:
if not s:
return s
res = []
count = 1
for i in range(1, len(s)):
if s[i] == s[i - 1]:
count += 1
else:
res.append(s[i - 1] + str(count))
count = 1
# последний блок
res.append(s[-1] + str(count))
compressed = "".join(res)
return compressed if len(compressed) < len(s) else s
🧠 Суть решения:
•идём по строке один раз
•считаем подряд идущие символы
•собираем результат в список (не строку — важно для скорости)
•в конце сравниваем длины