PythonのSequenceMatcherで最長共通部分文字列を求める方法
はじめに
2つの文字列が与えられたとき、その中から最も長い共通部分文字列(Longest Common Substring)を見つけて出力するのが本記事の目的です。Pythonでは、標準ライブラリ difflib に含まれる SequenceMatcher クラスの find_longest_match() メソッドを使うことで、この問題を簡単かつ効率的に解決できます。
SequenceMatcherとは
difflib.SequenceMatcher は、要素がハッシュ可能である限り、任意の型のシーケンス同士を比較できる柔軟なクラスです。文字列だけでなく、リストやタプルなどの比較にも利用できます。
主に使用するメソッドは以下の通りです。
find_longest_match(alo, ahi, blo, bhi)
1つ目のシーケンスの a[alo:ahi] と、2つ目のシーケンスの b[blo:bhi] の範囲内で、最も長く一致するブロックを検索します。戻り値はMatchオブジェクトで、match.a は1つ目の文字列側の開始位置、match.b は2つ目の文字列側の開始位置、match.size は一致した部分の長さを表します。
実行例
Input: str1 = "pythonprogramming",
str2 = "pro"
Output: pro
アルゴリズム
Step 1: 2つの文字列を入力する。 Step 2: 入力された文字列でSequenceMatcherオブジェクトを初期化する。 Step 3: find_longest_match()で最長の一致部分を検索する。 Step 4: 最長の共通部分文字列を出力する。
サンプルコード
# Python program to find Longest Common Sub-string
from difflib import SequenceMatcher
def matchsubstring(m,n):
seqMatch = SequenceMatcher(None,m,n)
match = seqMatch.find_longest_match(0, len(m), 0, len(n))
if (match.size!=0):
print ("Common Substring ::>",m[match.a: match.a + match.size])
else:
print ('No longest common sub-string found')
# Driver program
if __name__ == "__main__":
X = input("Enter first String ")
Y = input("Enter second String ")
matchsubstring(X,Y)
出力結果
Enter first String pythonprogramming Enter second String pro Common Substring ::> pro
まとめ
SequenceMatcher を使えば、複雑なアルゴリズムを自前で実装することなく、わずか数行のコードで最長共通部分文字列を取得できます。文字列の類似度チェックや差分検出など、さまざまな場面で応用できる便利な手法なので、ぜひ活用してみてください。
-
Pythonで2つの数の公約数を求めるプログラムの書き方
はじめに この記事では、以下の問題文に対する解決方法について学んでいきます。 問題文 2つの整数が与えられたとき、それらに共通する約数(公約数)の個数を表示する必要があります。 アプローチの考え方 まず、入力として受け取った2つの数のうち、小さい方の値(最小値)を計算します。続いて、1からその最小値までの各値で2つの数を順番に割っていき、両方の数を割り切ることができるかどうかをループ処理で確認します。 条件が真(True)と評価されるたびに、カウンターを1ずつ増加させます。最終的なカウンターの値が、2つの数の公約数の個数となります。 実装例 それでは、以下のコードで実際の実装を見てみましょう。
-
Pythonでアナグラム部分文字列を検索する方法【スライディングウィンドウで実装】
はじめに 本記事では、「テキスト中からパターンとそのアナグラム(文字の並べ替え)をすべて検索する」という問題を、Pythonで解く方法を解説します。 問題の定義 問題文: テキストとパターンが与えられます。このとき、テキスト内に出現するパターン本体だけでなく、その並べ替え(アナグラム)すべての出現位置を出力してください。 たとえば、パターンが「TOR」であれば、「ROT」「OTR」「RTO」なども同じ文字構成を持つため、すべて検索対象となります。 アルゴリズムのポイント この問題はスライディングウィンドウ(滑動窓)の考え方を使うと効率的に解けます。手順は以下のとおりです。 パターンの各文