Пройдите строку сериями: запишите символ и длину серии, если она больше одного. Одиночные символы оставьте без счётчика, сохраняя регистр.
Компрессия строки
Пройдите строку сериями: запишите символ и длину серии, если она больше одного. Одиночные символы оставьте без счётчика, сохраняя регистр.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Дана строка, в которой могут встречаться одинаковые символы, идущие подряд. Если символ повторяется несколько раз подряд, необходимо оставить одну его копию и указать количество повторений. Если символ встречается единожды, он остаётся без изменений. Пример: AAABBBCCXYZDDDD → A3B3C2XYZD4
public String compress(String s) {
// ...
}
Ответ
Пройдите строку сериями: запишите символ и длину серии, если она больше одного. Одиночные символы оставьте без счётчика, сохраняя регистр.
public String compress(String s) {
java.util.Objects.requireNonNull(s);
StringBuilder result = new StringBuilder();
for (int i = 0; i < s.length();) {
char current = s.charAt(i);
int start = i++;
while (i < s.length() && s.charAt(i) == current) i++;
result.append(current);
if (i - start > 1) result.append(i - start);
}
return result.toString();
}
Для AAABBBCCXYZDDDD получится A3B3C2XYZD4. Время O(n), память O(n) на результат. Пустая строка поддерживается; единица сравнения — char. При наличии цифр во входе такой формат не всегда обратим без дополнительных правил экранирования.