Массивы/струны проблемы кодирования (4 серии деталей)
Оператор задачи: Напишите функцию для сжатия данной строки. Верните сжатую строку, только если она сохраняет пространство.
Сложный уровень: Легкий
Тестовые случаи
- ‘Aaabaaccdddd’ —> ‘a3ba2c2d4’
- ‘Baaaccdddd’ —> ‘ba3c2d4’
- ‘Aabbcc’ -> ‘aabbcc’
- ‘Bbbaaccccdd’ -> ‘b3a2c4d2’
Алгоритм
- Установите указатель на первый символ строки, инициализируйте пустую строку и счетчик.
- Итерация через строку и проверьте, равен ли символ первого символа строки.
- Если оба стоят счетчик приращения.
Еще,
- Добавьте первый символ, и его счет для получения строки.
- Если счет больше 1, то добавьте только счет к строке результата.
- Иначе добавьте пустую строку в строку результата.
- Теперь первым персонажем будет текущий персонаж.
- сбросить значение счетчика до 1.
- Добавьте первый символ, и его счет для получения строки.
Добавьте последний символ, и его счет для получения строки.
Верните результирующую сжатую строку, если ее длина меньше, чем данная строка, иначе верните заданную строку.
Сложность времени и пространства
- Сложность времени: O (n)
- Сложность пространства: O (n)
Код
class CompressString(object): def compress(self, input): if input is None or not input: return input result = '' count = 0 prev_char = input[0] for char in input: if char == prev_char: count += 1 else: result += prev_char + (str(count) if count > 1 else '') prev_char = char count = 1 result += prev_char + (str(count) if count > 1 else '') return result if len(result) < len(input) else input
Более точное сжатие
class CompressString(object): def compress(self, input): if input is None or not input: return input result = '' count = 0 prev_char = input[0] for char in input: if char == prev_char: count += 1 else: if count > 2: result += prev_char + (str(count)) prev_char = char count = 1 elif count == 1: result += prev_char count = 1 prev_char = char else: result += prev_char result += prev_char count = 1 prev_char = char result += prev_char + (str(count) if count > 2 else prev_char) return result if len(result) < len(input) else input
Тест
import unittest from compressString import CompressString class TestCompress(unittest.TestCase): def testCompress(self, func): self.assertEqual(func(None), None) self.assertEqual(func(''), '') self.assertEqual(func('AABBCC'), 'AABBCC') self.assertEqual(func('AAABCCDDDDE'), 'A3BC2D4E') self.assertEqual(func('BAAACCDDDD'), 'BA3C2D4') self.assertEqual(func('AAABAACCDDDD'), 'A3BA2C2D4') print('Success: testCompress') def main(): test = TestCompress() compress_string = CompressString() test.testCompress(compress_string.compress) if __name__ == '__main__': main()
Оригинальная статья
GitHub Solution
Счастливого кодирования!
Массивы/струны проблемы кодирования (4 серии деталей)
Оригинал: “https://dev.to/codewithml/string-compression-3hgb”