diff --git a/0443.String-Compression/memo.md b/0443.String-Compression/memo.md new file mode 100644 index 0000000..b3d6790 --- /dev/null +++ b/0443.String-Compression/memo.md @@ -0,0 +1,17 @@ +# 443.String-Compression + +## step1 +数字が二桁になる場合を考えなかったがそれ以外にはつまらずに書けた。11mほど。 + +時間計算量:O(N)、空間計算量 ~~O(1)~~ O(log n): str(count) のメモリ確保のため + +## 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 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