Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonでデコードされた文字列の指定インデックスの文字を効率的に求める方法

エンコードされた文字列 S が与えられたとします。この文字列を先頭から1文字ずつ読み込みながら、テープにデコード結果を書き出していきます。読み込んだ文字に応じて、以下の処理が行われます。

  • 読み込んだ文字が英字の場合:その文字をそのままテープに書き込みます。
  • 読み込んだ文字が数字の場合:現在のテープ全体を、その数字から1を引いた回数だけ追加で書き込みます(つまり、テープの内容がその数字倍になります)。

ここで、エンコードされた文字列 S とインデックス K が与えられたとき、デコード後の文字列における K 番目の文字(インデックスは1から開始)を見つけて返す必要があります。

例えば、文字列が「hello2World3」で k = 10 の場合、出力は「o」となります。これは、デコード後の文字列が「hellohelloWorldhellohelloWorldhellohelloWorld」になり、10番目の文字が「o」であるためです。

解法のアプローチ

この問題を解くには、以下の手順に従います。

  • size を 0 で初期化します。
  • 文字列 s の各文字 i について前方向に走査します。
    • i が数字なら size := size × int(i)、それ以外なら size := size + 1 とします。これにより、デコード後の文字列の全長が求まります。
  • 次に、文字列 s を末尾から先頭へ向かって逆順に走査します。
    • k := k mod size とします。
    • s[i] が英字で k = 0 の場合、s[i] を返します。
    • s[i] が英字なら size を 1 減らし、数字なら size := size / int(s[i]) とします。
  • 該当する文字が見つからない場合は空文字列を返します。

この手法のポイントは、実際に巨大なデコード済み文字列を生成する必要がない点です。まずデコード後の総文字数 size を事前に計算しておき、末尾から逆算することで、K 番目の文字を効率的に特定できます。これにより、メモリ使用量と計算時間を大幅に削減でき、入力文字列が非常に長い場合でも高速に動作します。

実装例

class Solution(object):
    def decodeAtIndex(self, s, k):
        """
        :type S: str
        :type K: int
        :rtype: str
        """
        size = 0
        for i in s:
            if i.isdigit():
                size *= int(i)
            else:
                size += 1
        #print(size)
        for i in range(len(s) - 1, -1, -1):
            k %= size
            if s[i].isalpha() and k == 0:
                return s[i]
            if s[i].isalpha():
                size -=1
            else:
                size /= int(s[i])
        return ""
ob = Solution()
print(ob.decodeAtIndex("hello2World3", 10))

入力

"hello2World3"
10
ob.decodeAtIndex("hello2World3", 10)

出力

o
  1. Pythonでシーケンスのインデックスを使って反復処理する方法

    Pythonにおけるシーケンス型オブジェクトとは、リスト・タプル・文字列のように、要素が順序をもって並んでいるデータ構造のことです。それぞれの要素には、0から始まるインデックス(添字)を使ってアクセスできます。この記事では、インデックスを利用してシーケンス内の要素を1つずつ順番に処理する基本的な方法を解説します。range()とlen()を組み合わせた基本形シーケンスの反復処理で最もよく使われるのが、len()関数とrange()関数の組み合わせです。len()でシーケンスの長さを取得し、それをrange()に渡すことで、「0 ~ 長さ-1」までの連続した整数が生成されます。これをfor文で回

  2. Pythonで文字列のサイズ(長さ)を取得する方法を解説

    Pythonでは、リストやタプル、文字列などの複合オブジェクトの長さを取得できる組み込み関数 len() が用意されています。文字列の長さを知りたい場合は、その文字列をそのまま len() に渡すだけでOKです。len() を使った文字列の長さ取得サンプルコードprint(len(Hello World!))実行結果12この例では、「Hello World!」に含まれる12文字(スペースも1文字としてカウント)が返されています。日本語のようなマルチバイト文字の場合でも、len() は「文字数」を返す点に注意してください。バイト単位でサイズを取得したい場合:sys.getsizeof()文字数で