2017-05-05 19 views
-2

したがって、私は2つの単語を持っています。私は各単語から他への最大重なりを見つける関数を書いてみたい。例:Pythonの2つの単語から2つの単語の単語の重なりを計算します

words = ['AAB', 'BAA'] 
find_overlap('AAB', 'BAA') 

万一出力Bとサイズ1、および:

find_overlap('BAA', 'AAB') 

万一出力AAとサイズ2.それを行う方法上の任意の提案?

編集:私はpythonからdifflib.SequenceMatcherを試しましたが、出力がわかりません。

s1 = "AAB" 
s2 = "BAA" 
s = difflib.SequenceMatcher(None, s1, s2) 
pos_a, pos_b, size = s.find_longest_match(0, len(s1), 0, len(s2)) 
print(pos_a, pos_b, size) 
+0

最初に可能な限り重なりを確認し、より小さい重なりを繰り返すように繰り返します。 – Moberg

+0

@Mobergこれは、* War and Peace *と* Crime and Punishment *の完全なテキストの最大の重複を調べるために、数十万文字の重なりをチェックしてから作業を開始することを示唆しています。非常に効率的に聞こえません。オーバーラップの長さはおそらく0です。 –

+0

@ JohnColemanいいえ、それほど効率的ではありません。それは、WaPでCaPの最初の文字の最初の出現を見つけ出し、あなたの道を切り開くことを意味しますが。一致しないとすぐに次の出現にスキップします。他にどんな方法がありますか? :) – Moberg

答えて

0

短い文字列の場合、おそらく純粋なアプローチが適切です。例えば、@Mobergのアイデアは、この

def largest_overlap(s1,s2): 
    n = min(len(s1),len(s2)) 
    for i in range(n,0,-1): 
     if s2.startswith(s1[-i:]): 
      return s1[-i:] 
    return '' 

いくつかのテストケースのように実装することができます。

print("BAA, AAB =>", largest_overlap("BAA", "AAB")) 
print("AAB, BAA =>", largest_overlap("AAB", "BAA")) 
print("AAA, BB =>", largest_overlap("AAA", "BB")) 
print("AA, AABB =>", largest_overlap("AA", "AABB")) 
print("hello world, world peace =>", largest_overlap("hello world", "world peace")) 

出力:

BAA, AAB => AA 
AAB, BAA => B 
AAA, BB => 
AA, AABB => AA 
hello world, world peace => world 

長い文字列の場合は、あなたがより洗練されたアルゴリズムが必要になる場合があります、thisに類似したものです。

+0

ありがとうございます。オーバラップのない単語全体を出力するにはどうしたらいいですか?例えば、BAA、AAB => AA、BAABも欲しいです。 –

+0

@LoraSinha 's'が返されるオーバーラップである場合、' s1 + s2 [len(s):] 'はオーバーラップと連結された2つの単語です。 –

関連する問題