From 9bc5afd912fe9dba95467a40be2f54e167e8fce8 Mon Sep 17 00:00:00 2001 From: tom4649 Date: Mon, 15 Jun 2026 19:54:14 +0900 Subject: [PATCH 1/2] step1,2 --- 0443.String-Compression/memo.md | 17 +++++++++++++++++ 0443.String-Compression/step1.py | 16 ++++++++++++++++ 0443.String-Compression/step2.py | 19 +++++++++++++++++++ 3 files changed, 52 insertions(+) create mode 100644 0443.String-Compression/memo.md create mode 100644 0443.String-Compression/step1.py create mode 100644 0443.String-Compression/step2.py diff --git a/0443.String-Compression/memo.md b/0443.String-Compression/memo.md new file mode 100644 index 0000000..7139f7a --- /dev/null +++ b/0443.String-Compression/memo.md @@ -0,0 +1,17 @@ +# 443.String-Compression + +## step1 +数字が二桁になる場合を考えなかったがそれ以外にはつまらずに書けた。11mほど。 + +時間計算量:O(N)、空間計算量O(1) + +## step2 + +https://leetcode.com/problems/string-compression/solutions/3245804/clean-codes-full-explanation-two-pointer-e4o9/ + +while文を使った解法。この方が「数字の数を数える」という直感には合っているかもしれない。 + +mediumの割には簡単な問題なように感じた。他の言語だと書き方が難しくなるのかもしれない。 + +## step3 +今回は省略で良いだろう diff --git a/0443.String-Compression/step1.py b/0443.String-Compression/step1.py new file mode 100644 index 0000000..bdc0357 --- /dev/null +++ b/0443.String-Compression/step1.py @@ -0,0 +1,16 @@ +class Solution: + def compress(self, chars: list[str]) -> int: + length = 0 + left = 0 + for right in range(len(chars) + 1): + if right < len(chars) and chars[left] == chars[right]: + continue + chars[length] = chars[left] + length += 1 + if right - left > 1: + for c in str(right - left): + chars[length] = c + length += 1 + left = right + + return length diff --git a/0443.String-Compression/step2.py b/0443.String-Compression/step2.py new file mode 100644 index 0000000..db66f1e --- /dev/null +++ b/0443.String-Compression/step2.py @@ -0,0 +1,19 @@ +class Solution: + def compress(self, chars: list[str]) -> int: + length = 0 + index = 0 + + while index < len(chars): + c = chars[index] + count = 0 + while index < len(chars) and chars[index] == c: + index += 1 + count += 1 + chars[length] = c + length += 1 + if count > 1: + for digit in str(count): + chars[length] = digit + length += 1 + + return length From a97e410385ae0d8d08cb06e560a01739c37132b0 Mon Sep 17 00:00:00 2001 From: tom4649 Date: Thu, 18 Jun 2026 06:16:08 +0900 Subject: [PATCH 2/2] Add suggested changes --- 0443.String-Compression/memo.md | 2 +- .../step2_constant_space.py | 33 +++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 0443.String-Compression/step2_constant_space.py diff --git a/0443.String-Compression/memo.md b/0443.String-Compression/memo.md index 7139f7a..b3d6790 100644 --- a/0443.String-Compression/memo.md +++ b/0443.String-Compression/memo.md @@ -3,7 +3,7 @@ ## step1 数字が二桁になる場合を考えなかったがそれ以外にはつまらずに書けた。11mほど。 -時間計算量:O(N)、空間計算量O(1) +時間計算量:O(N)、空間計算量 ~~O(1)~~ O(log n): str(count) のメモリ確保のため ## step2 diff --git a/0443.String-Compression/step2_constant_space.py b/0443.String-Compression/step2_constant_space.py new file mode 100644 index 0000000..b099c6b --- /dev/null +++ b/0443.String-Compression/step2_constant_space.py @@ -0,0 +1,33 @@ +class Solution: + def compress(self, chars: list[str]) -> int: + def append_count(length_before, count): + length_after = length_before + while count > 0: + chars[length_after] = str(count % 10) + count //= 10 + length_after += 1 + + left = length_before + right = length_after - 1 + while left < right: + chars[left], chars[right] = chars[right], chars[left] + left += 1 + right -= 1 + + return length_after + + length = 0 + index = 0 + + while index < len(chars): + c = chars[index] + count = 0 + while index < len(chars) and chars[index] == c: + index += 1 + count += 1 + chars[length] = c + length += 1 + if count > 1: + length = append_count(length, count) + + return length