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

【Python】文字列を左に回転させて全パターンを生成するプログラムの書き方

問題の概要

サイズ n の文字列 s が与えられたとき、1文字分、2文字分……n文字分と左に回転させた結果として得られる、すべての文字列を求めることを考えます。

たとえば、入力が s = "hello" の場合、出力は次のようになります。

['elloh', 'llohe', 'lohel', 'ohell', 'hello']

ご覧のとおり、先頭の文字が順番に末尾へ移動していき、n 回回転すると元の文字列「hello」に戻ります。

解き方のアプローチ

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

  • 結果を格納するための空のリスト res を用意する
  • 文字列 s の長さを n として取得する
  • i が 0 から n-1 までの範囲でループを回す
    • s の先頭1文字を取り除き、それを末尾に付け足した新しい文字列を作成する(s[1:n] + s[0])
    • その文字列をリスト res の末尾に追加する
  • 最後に res を返す

実装例

それでは、実際のコードを見てみましょう。

def solve(s):
    res = []
    n = len(s)
    for i in range(0, n):
        s = s[1:n] + s[0]
        res.append(s)
    return res

s = "hello"
print(solve(s))

入力

hello

出力

['elloh', 'llohe', 'lohel', 'ohell', 'hello']

コードのポイント

このコードの核心となるのは s[1:n] + s[0] という部分です。Pythonのスライス機能を使うことで、「先頭の1文字を除いた残りの部分」と「先頭の1文字」を連結し、左への回転をシンプルに実現しています。

各ループでの処理の流れを整理すると、次のようになります。

  • 1回目:「elloh」(h が末尾へ移動)
  • 2回目:「llohe」(e が末尾へ移動)
  • 3回目:「lohel」(l が末尾へ移動)
  • 4回目:「ohell」(o が末尾へ移動)
  • 5回目:「hello」(l が末尾へ移動し、元の文字列に戻る)

文字列を n 回回転すると必ず元に戻るため、ループはちょうど n 回実行すれば十分です。計算量についても触れておくと、1回の回転に O(n)、それを n 回繰り返すため、全体の時間計算量は O(n²) となります。短い文字列であれば実用上まったく問題ありませんが、非常に長い文字列を扱う場合は注意が必要です。

  1. Pythonで文字列を指定サイズ(N文字)ごとに分割する方法

    問題の概要 文字列 s と整数 n が与えられたとき、s を n 文字ずつの部分文字列に分割することを考えます。 例えば、入力が s = abcdefghijklmn、n = 4 の場合、出力は [abcd, efgh, ijkl, mn] となります。最後の断片が n 文字に満たない場合でも、残りの文字列がそのまま出力される点に注意してください。 解決のアプローチ この問題は、以下の手順で解くことができます。 インデックス i を 0 で初期化します。 結果を格納するための空のリスト f を用意します。 i が文字列の長さ未満である間、次の処理を繰り返します。 s[i : i+n](イ

  2. Pythonでアナグラム単語の最大サブセットのサイズを求める方法

    はじめに 小文字からなる文字列の配列が与えられたとき、互いにアナグラムの関係にある文字列からなる「最大のサブセット」のサイズを求めるのが本記事の課題です。アナグラムとは、ある文字列が別の文字列の並べ替え(文字の順番の入れ替え)によって作られる関係のことです。たとえば、「python」と「typhon」はアナグラムの関係にあります。 Pythonでは、collectionsモジュールのCounter()メソッドを活用することで、この問題をシンプルかつ効率的に解くことができます。 アルゴリズムの手順 入力文字列をスペースで区切り、単語ごとに分割します。 文字列リスト内の各文字列をソートします。