Pythonで文字列をランレングス符号化(RLE)するプログラムの書き方
文字列 s が与えられたとき、これをランレングス符号化(Run-Length Encoding)と呼ばれる手法でエンコードすることを考えます。
ランレングス符号化は、文字列を高速かつシンプルに圧縮できる手法の一つです。基本的なアイデアは、「連続して繰り返される同じ文字を、連続回数(カウント)+その文字というペアに置き換える」というものです。
例えば、入力が s = "BBBBAAADDCBB" の場合、出力は "4B3A2D1C2B" となります。これは「Bが4個、Aが3個、Dが2個、Cが1個、Bが2個続いている」という意味を表しています。
アルゴリズムの手順
この問題は、以下の手順で解くことができます。
- 結果を格納する変数
resを空文字列で初期化します。 - 現在比較中の文字を保持する
tmpに、文字列sの最初の文字を代入します。 - カウンター
countを 1 で初期化します。 iを 1 から文字列の長さまでループさせます。s[i]がtmpと異なる場合:resにcountとtmpを連結した後、tmpをs[i]に更新し、countを 1 に戻します。- 同じ文字の場合:
countを 1 増やします。
- ループ終了後、
resに最後のcountとtmpを連結して返します。
実装例
それでは、実際のPythonコードを見てみましょう。
class Solution:
def solve(self, s):
res = ""
tmp = s[0]
count = 1
for i in range(1, len(s)):
if s[i] != tmp:
res += str(count) + tmp
tmp = s[i]
count = 1
else:
count += 1
return res + str(count) + tmp
ob = Solution()
print(ob.solve("BBBBAAADDCBB"))
入力
"BBBBAAADDCBB"
出力
4B3A2D1C2B
計算量と注意点
このアルゴリズムは文字列を先頭から一度だけ走査すればよいため、時間計算量は O(n)、必要なメモリも出力の長さに依存して O(n) となります。
なお、空文字列が入力された場合には s[0] の参照時に IndexError が発生するため、実運用では関数の冒頭に if not s: return "" のようなガード処理を追加しておくと安全です。
-
Pythonで配列の反転数(転倒数)をカウントする方法
はじめに この記事では、配列内の反転(インバージョン)をカウントする問題とその解決策について詳しく解説します。 問題定義 問題: リストが与えられたとき、その中に含まれる反転の数をカウントして表示します。 反転数とは、配列を昇順にソートされた状態にするために必要な入れ替え(スワップ)の回数を表す指標です。具体的には、i < j かつ arr[i] > arr[j] を満たす要素のペア(i, j)の総数として定義されます。 実装例 # 反転数をカウントする関数 def InvCount(arr, n): inv_count = 0 for i in range(n
-
文字列内の単語の出現回数をカウントするPythonプログラムの作成方法
この記事では、ユーザーから入力された文字列の中に、指定した単語が何回出現するかをカウントし、その結果を出力するPythonプログラムを紹介します。文字列操作の基礎を学ぶのに最適な題材です。 実行例 入力:Python is an interpreted high-level programming language for general purpose programming. カウントする単語:programming 出力:2 上記の例では、「programming」という単語が文中に2回出現しているため、出力は「2」となります。 アルゴリズム wordoccurences(n, p