メインコンテンツへスキップ

NeetCode 150 [Arrays & Hashing]:medium 3/6

· loading · loading ·
kiitosu
著者
kiitosu
画像処理やデバイスドライバ、データ基盤構築からWebバックエンドまで、多様な領域に携わってきました。地図解析や地図アプリケーションの仕組みにも経験があり、幅広い技術を活かした開発に取り組んでいます。休日は草野球とランニングを楽しんでいます。
目次

NeetCodeのSolutionを書いていく
#

Encode and Decode Strings
#

問題概要
#

文字列のリストを単一の文字列にエンコードしましょう。 エンコードされた文字列は元の文字列のリストにデコードして戻すことができます。 encodeとdecodeを実装しましょう。

配列数は0以上100未満。 文字列長は0以上200未満。

計算時間はO(m)、メモリーはO(1)を目指す。 mは全ての文字の合算数。

#

Input: [“neet”,“code”,“love”,“you”] Output:[“neet”,“code”,“love”,“you”]

Input: [“we”,“say”,":",“yes”] Output: [“we”,“say”,":",“yes”]

メモ
#

シリアライズ、デシリアライズすればいい。 jsonを使えば一発。 でもそういう問題ではないのかな?

自分で実装しようと思うとどうなるんだろうか。 問題は文字列リテラルのデリミタのエスケープ? いや、違うか、それは文字列として扱っている時点で解決されているから、シリアライズする時の区切り文字か。

文字列数,:字列文字列数:文字列 みたいに最初に「文字列数:」の情報を入れた形の文字列にすれば復元できそう。 でもこれだと、メモリがO(1)ではなくO(m)になる。 シリアライズする時点でメモリO(1)は無理な気がするけど。。。

答えを見てもO(1)には見えない。 chatGptにきいてもO(n)とのこと。 うぅむ。

from typing import List

# import json
# class Solution:
#     def encode(self, strs: List[str]) -> str:
#         return json.dumps(strs)

#     def decode(self, s: str) -> List[str]:
#         return json.loads(s)


class Solution:
    def encode(self, strs: List[str]) -> str:
        ret = ""
        for s in strs:
            ret += str(len(s)) + ":"
            ret += s
        return ret

    def decode(self, s: str) -> List[str]:
        ret = []
        temp = ""
        i = 0
        while i < len(s):
            c = s[i]
            i += 1
            temp += c if c != ":" else ""
            if c == ":":
                strlen = int(temp)
                end = i + strlen
                ret.append(s[i:end])
                i = end
                temp = ""
        return ret
Reply by Email

関連記事

NeetCode 150 [Arrays & Hashing]:medium 1/6
· loading · loading
NeetCode 150 [Arrays & Hashing]:medium 2/6
· loading · loading
NeetCode 150 [Bit Manipulation]:easy 2/2
· loading · loading