【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²) となります。短い文字列であれば実用上まったく問題ありませんが、非常に長い文字列を扱う場合は注意が必要です。
-
Pythonで文字列を指定サイズ(N文字)ごとに分割する方法
問題の概要 文字列 s と整数 n が与えられたとき、s を n 文字ずつの部分文字列に分割することを考えます。 例えば、入力が s = abcdefghijklmn、n = 4 の場合、出力は [abcd, efgh, ijkl, mn] となります。最後の断片が n 文字に満たない場合でも、残りの文字列がそのまま出力される点に注意してください。 解決のアプローチ この問題は、以下の手順で解くことができます。 インデックス i を 0 で初期化します。 結果を格納するための空のリスト f を用意します。 i が文字列の長さ未満である間、次の処理を繰り返します。 s[i : i+n](イ
-
Pythonでアナグラム単語の最大サブセットのサイズを求める方法
はじめに 小文字からなる文字列の配列が与えられたとき、互いにアナグラムの関係にある文字列からなる「最大のサブセット」のサイズを求めるのが本記事の課題です。アナグラムとは、ある文字列が別の文字列の並べ替え(文字の順番の入れ替え)によって作られる関係のことです。たとえば、「python」と「typhon」はアナグラムの関係にあります。 Pythonでは、collectionsモジュールのCounter()メソッドを活用することで、この問題をシンプルかつ効率的に解くことができます。 アルゴリズムの手順 入力文字列をスペースで区切り、単語ごとに分割します。 文字列リスト内の各文字列をソートします。