n文字の組み合わせで構成される長さの文字列が与えられますA B D。
例-1:AAAABAAAADADDDDADDDBBBBBBDDDDA
Thresholdof x、指定された部分文字列には、最大長の他の連続した部分文字列を含めることができますx
Ex-2: AEx-1のサブシーケンスのAAAABAAAADA場合、しきい値の (1,11) 境界を持つ正当な部分文字列ですx = 2。
同様に、主な文字列を無視して、 と の部分文字列を個別Aに抽出したいと思います。メイン文字列には、各タイプのサブ文字列が多数存在する場合があります。DB
モデル出力:
Type Boundaries
A 1,11
D 12,20
D 26,29
Aしきい値より大きい距離が文字列を壊した場合、s間の距離を見つけることによって非効率的な非アルゴリズムの方法を実装しました。と に対してこれを個別に実行する必要がAありDました。これにより、境界領域が重なります。
これを解決するためのより良いアプローチはありますか?
編集-1
有効な部分文字列は任意の長さにできますが、しきい値より大きい他の部分文字列によって汚染されてはなりませんx。つまり、その部分文字列の検索中に、他の文字が含まれていたり、連続してしきい値よりも大きくなったりしAてはなりません。BD
x = 2の検索中AにAABBAAAA, AABDAAAAが有効であるが、 ではない場合AADBDAAA, AABBBAAA。A同様に、D(およびB汚染物質になります)を検索している間。
「Pham Trung」の回答を使用したEDIT-2実装
コード:
start = 0
lastA = -1
lastD = -1
x = 2
arr = ["A", "A", "A", "A", "B", "A", "A", "A", "A", "D", "A", "D", "D", "D", "D", "A", "D", "D", "D", "B", "B", "B", "B", "B", "B", "D", "D", "D", "D", "A"]
for i in range(0, len(arr)):
if(arr[i] == 'A'):
if(lastA != -1 and i - lastA > x):
print("A", start + 1, lastA + 1)
start = i
lastA = i
elif(arr[i] == 'D'):
if(lastD != -1 and i - lastD > x):
print("D", start + 1, lastD + 1)
start = i
lastD = i
出力:
A 1 11
D 16 19
A 26 16
コードは部分文字列の後に1st部分文字列を抽出できません。