Pythonで2つの文字列を交互にマージする方法を解説
2つの文字列 s と t があるとします。これらを、s の文字から始めて交互に1文字ずつ取り出しながら結合(マージ)することを考えます。もし2つの文字列の長さが異なる場合は、余った文字をそのままマージ後の文字列の末尾に追加します。
例えば、入力が s = "major"、t = "general" の場合、出力は mgaejnoerral になります。t の方が長いため、余りの部分である ral が末尾に追加されるためです。
解決の手順
この問題は、以下のステップで解決できます。
インデックス
iとjをそれぞれ 0 で初期化する結果を格納する空の文字列
resultを用意するiがsの長さ未満かつjがtの長さ未満の間、以下を繰り返すresultにs[i]とt[j]を順に連結するiとjをそれぞれ1つ進める
iがsの長さ未満の間、resultにs[i]を連結し、iを進めるjがtの長さ未満の間、resultにt[j]を連結し、jを進めるresultを返す
それでは、実際の実装例を見てみましょう。
実装例
def solve(s, t):
i = j = 0
result = ""
while i < len(s) and j < len(t):
result += s[i] + t[j]
i += 1
j += 1
while i < len(s):
result += s[i]
i += 1
while j < len(t):
result += t[j]
j += 1
return result
s = "major"
t = "general"
print(solve(s, t))
入力
"major", "general"
出力
mgaejnoerral
より簡潔な書き方:itertools.zip_longest を活用
Pythonの標準ライブラリ itertools.zip_longest を使うと、同じ処理をより短くエレガントに記述できます。この関数は、長い方の文字列に合わせて要素を組み合わせ、足りない部分を指定した値(デフォルトでは空文字)で埋めてくれます。
from itertools import zip_longest
def solve(s, t):
return "".join(a + b for a, b in zip_longest(s, t, fillvalue=""))
s = "major"
t = "general"
print(solve(s, t)) # mgaejnoerral
どちらの方法でも計算量は O(n + m)(n、m は各文字列の長さ)となり、効率的に動作します。ループの挙動を理解したい場合は前者の実装、コードの簡潔さを重視する場合は zip_longest を使った後者の実装がおすすめです。
-
Pythonでマージソートを実装する方法を徹底解説!サンプルコード付き
この記事では、マージソート(Merge Sort)のアルゴリズムを使って配列を並べ替えるPythonプログラムについて、実際のコード例を交えながら詳しく解説します。 問題設定 課題 − 与えられた配列を、マージソートの考え方を用いて昇順に並べ替えます。 マージソートは分割統治法に基づく整列アルゴリズムです。まず配列を半分ずつ再帰的に分割し、要素が1つになった時点でそれを「ソート済み」とみなします。その後、隣り合う部分配列同士を先頭から比較しながら統合(マージ)していくことで、最終的に配列全体が整列されます。 Pythonでの実装例 # マージ関数 def merge(arr, l, m,
-
【Python】再帰を使わない反復型(ボトムアップ)マージソートの実装方法を解説
この記事では、反復処理(イテレーション)のみでマージソートを実装する方法について解説します。再帰呼び出しを使わずに、whileループだけで配列を整列させる「ボトムアップ方式」のアプローチを見ていきましょう。 問題文 問題: 与えられた配列を、反復処理によるマージソートの考え方を用いて昇順に並べ替えてください。 例として、次の整数配列を扱います。 a = [2, 5, 3, 8, 6, 5, 4, 7] 反復マージソートの考え方 通常のマージソートは再帰を使って配列を分割しますが、反復版では最初から要素数1の部分配列として捉え、隣接する部分配列同士を統合(マージ)しながらサイズを倍々に増やしてい