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

Pythonで解く「逆文字列 II」― 2k文字ごとに先頭k文字を反転する方法

問題概要

文字列 s と整数 k が与えられます。文字列の先頭から数えて 2k 文字ごとのブロックについて、それぞれのブロック内の最初の k 文字を反転してください。ただし、以下のルールに従います。

  • 残りの文字が 2k 文字未満で k 文字以上の場合: 最初の k 文字のみを反転し、残りは元のままにします。
  • 残りの文字が k 文字未満の場合: 残りの文字をすべて反転します。

たとえば、入力が "abcdefgh"、k = 3 のとき、出力は "cbadefhg" となります。これは、最初の 6 文字 "abcdef" のうち先頭 3 文字 "abc" が "cba" に反転され、残りの "gh" は k 文字未満のためすべて反転されて "hg" になるからです。

アルゴリズムの手順

この問題は、次の手順で解くことができます。

  • 文字列 s を文字のリスト l に変換します。
  • i を k − 1 で初期化します。
  • i が「リストの長さ + k」より小さい間、以下を繰り返します。
    • a := l[0 : i−k+1](すでに処理済みの先頭部分)
    • b := l[i−k+1 : i+1](今回反転する対象の部分)
    • c := l[i+1 :](まだ処理していない末尾部分)
    • l := a + b を反転したもの + c として更新します。
    • i に 2k を加算し、次のブロックへ進みます。
  • 最後に、リスト l の各文字を連結した文字列を返します。

実装例

理解を深めるために、以下の Python 実装を見てみましょう。

class Solution:
    def reverseStr(self, s, k):
        l = list(s)
        i = k-1
        while i < len(l)+k:
            a = l[:i-k+1]
            b = l[i-k+1:i+1]
            c = l[i+1:]
            l = a + b[::-1] + c
            i += 2*k
        return ''.join(l)

ob = Solution()
print(ob.reverseStr("abcdefg", 3))

入力

"abcdefg", 3

出力

cbadefg

処理の流れを確認

入力 "abcdefg"、k = 3 の場合、プログラムは次のように動作します。

  1. 初期状態:l = ["a","b","c","d","e","f","g"]、i = 2
  2. 1 回目のループ:a = ""、b = "abc"、c = "defg"。b を反転すると "cba" になり、l = "cbadefg" となります。その後、i は 8 に更新されます。
  3. 2 回目のループ:a = "cbadef"、b = "g"、c = ""。b は 1 文字しかないため反転しても変化せず、結果は "cbadefg" のままです。i が 14 となり条件を満たさなくなるため、ループを終了します。

このように、最終的に "cbadefg" が出力されます。計算量は文字列の長さを n とすると O(n) であり、非常に効率的な解法です。

  1. Pythonで文字列内の単語を逆順に並べ替える方法

    Pythonでは、split()メソッドとreversed()関数を組み合わせることで、文字列内のすべての単語を簡単に逆順にすることができます。この記事では、具体的な手順とサンプルコードを通じて、その実装方法を解説します。 やりたいこと まず、入力と出力のイメージをサンプルで確認しましょう。 入力: string = I am a python programmer 出力: programmer python a am I 別の例も見てみます。 入力: string = tutorialspoint is a educational website 出力: website educatio

  2. Pythonのcasefold()メソッドとは?文字列の小文字変換と比較方法を解説

    Pythonのcasefold()は、文字列内の英字をすべて小文字に変換するためのメソッドです。lower()と似ていますが、より積極的な変換を行う点が特徴で、ドイツ語の「ß」が「ss」に変換されるなど、国際化対応において強力な働きをします。2つの文字列に対してcasefold()を適用すれば、大文字・小文字の違いを無視して値を一致させることができます。そのため、ユーザー入力の比較や検索処理などで非常に役立ちます。casefold()の基本的な使い方次の例では、文字列にcasefold()を適用し、すべて小文字に変換された結果を出力しています。コード例string = BestTutorial