Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions 0443.String-Compression/memo.md
Original file line number Diff line number Diff line change
@@ -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
今回は省略で良いだろう
16 changes: 16 additions & 0 deletions 0443.String-Compression/step1.py
Original file line number Diff line number Diff line change
@@ -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):

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

str(right - left) で、O(log chars.length) の文字数のメモリが確保されると思うのですが、それが constant extra space と言えるのかどうか気になりました。かりに str をしようしないとしたら、どのようなロジックにすればよいでしょうか?

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ご指摘の通りで、count の桁数分 O(log chars.length) の空間計算量になりますね。自力で気付けませんでした。以下の関数を定義することで constant extra space になるかと思います。

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

chars[length] = c
length += 1
left = right

return length
19 changes: 19 additions & 0 deletions 0443.String-Compression/step2.py
Original file line number Diff line number Diff line change
@@ -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
33 changes: 33 additions & 0 deletions 0443.String-Compression/step2_constant_space.py
Original file line number Diff line number Diff line change
@@ -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