Pythonで文字列の文字から作れるすべての組み合わせのリストを求めるプログラム
文字列 s が与えられたとき、その文字を使って作れる「すべての組み合わせ」を求めます。同じ文字の集合からなる文字列が複数存在する場合は、辞書順で最小のものだけを出力します。なお、s に含まれる文字はすべて一意(重複なし)であるという制約があります。
たとえば、入力が s = "pqr" の場合、出力は ['r', 'qr', 'q', 'pr', 'pqr', 'pq', 'p'] のようになります。
解き方の手順
この問題は、文字列を末尾から先頭へ向かって走査し、それまでに生成した部分文字列のそれぞれに現在の文字を連結していくことで解決できます。具体的には次のステップに従います。
st_arr:= 結果を格納する新しい空のリストを作成する- i を (s の長さ − 1) から 0 まで、1 ずつ減らしながら繰り返す
- j を 0 から (st_arr の長さ − 1) まで繰り返す
- (s[i] + st_arr[j]) を st_arr の末尾に追加する
- s[i] 単体を st_arr の末尾に追加する
- j を 0 から (st_arr の長さ − 1) まで繰り返す
- st_arr を返す
実装例
理解を深めるため、以下のPythonコードを確認してみましょう。
def solve(s):
st_arr = []
for i in range(len(s)-1,-1,-1):
for j in range(len(st_arr)):
st_arr.append(s[i]+st_arr[j])
st_arr.append(s[i])
return st_arr
s = "pqr"
print(solve(s))
入力
"pqr"
出力
['r', 'qr', 'q', 'pr', 'pqr', 'pq', 'p']
アルゴリズムのポイント
文字列を右側(末尾)から処理することで、既存の組み合わせすべてに新しい文字を先頭に付け加えたパターンと、その文字単体のパターンが自然に生成されます。これにより、元の文字列での文字の並び順を保ったまま、空集合を除くすべての部分集合が漏れなく列挙されます。
文字が n 個ある場合、非空の部分集合は 2^n − 1 個存在するため、計算量は O(2^n) となります。文字数が増えると組み合わせの総数が爆発的に増加するため、長い文字列を扱う際は注意が必要です。
-
指定された文字列のすべての順列を出力するPythonプログラム
本記事では、以下の問題に対する解決策について詳しく学んでいきます。 問題文 1つの文字列が与えられたとき、その文字列から作成できるすべての順列(並べ替えの組み合わせ)を表示する必要があります。 それでは、以下の実装例で具体的な解決策を見ていきましょう。 実装例 # リストを文字列に変換 def toString(List): return .join(List) # 順列の生成 def permute(a, l, r): if l == r: print(toString(a)) else: for i in range(l, r +
-
Pythonで文字列のすべての順列を取得する方法【itertoolsと再帰で解説】
itertools.permutationsを使った方法 Pythonで文字列のすべての順列(並べ替え)を求める最も簡単な方法は、標準ライブラリのitertoolsモジュールにあるpermutations()関数を使用することです。この関数は、イテラブルなオブジェクトから要素を取り出し、指定した長さrの順列をタプルとして順番に返します。 結果を文字列として取得するには、関数の戻り値をループで処理し、各タプルの要素をjoin()で連結します。以下に具体例を示します。 from itertools import permutations result = [.join(p) for p in p