4

各文字列が「A - 何か」または「B - 何か他のもの」の形式であり、リスト項目のほとんどが「A」データと「B」データの断片の間で交互になっている文字列のリストが与えられた場合、どのように不規則性を取り除くことができますか?

  1. ABパターンを破る任意のシーケンスである不規則性。
  2. 複数の A がある場合は、次の B も削除する必要があります。
  3. 複数の B がある場合は、前の A も削除する必要があります。
  4. これらの無効なシーケンスを削除した後、リストの順序を維持する必要があります。

例:ABAB AAB ABABAB ABB ABAB AABB ABAB

この場合、AAB (ルール 2 を参照)、ABB (ルール 3 を参照)、および AABB を削除する必要があります。

4

4 に答える 4

3

削除するシーケンスのインデックスを返す正規表現で試してみます

>>> import re
>>> data = 'ABABAABABABABABBABABAABBABAB'
>>> [(m.start(0), m.end(0)) for m in re.finditer('(AA+B+)|(ABB+)', data)]
[(4, 7), (13, 16), (20, 24)]

またはストリッピングの結果

>>> re.sub('(AA+B+)|(ABB+)', '', data)
ABABABABABABABABAB
于 2013-11-02T23:02:16.517 に答える
1

使用itertools.groupby:

from itertools import groupby

def solve(strs):
    drop_next = False
    ans = []
    for k, g in groupby(strs):
        lis = list(g)
        if drop_next:
            #if True then don't append the current set to `ans`
            drop_next = False
        elif len(lis) > 1 and k == 'A':
            #if current group contains more than 1 'A' then skip the next set of 'B'
            drop_next = True
        elif len(lis) > 1 and k == 'B':
            #if current group contains more than 1 'B' then pop the last appended item
            if ans:
                ans.pop(-1)
        else:
            ans.append(k)
    return ''.join(ans)

strs = 'ABABAABABABABABBABABAABBABAB'
print solve(strs)
#ABABABABABABABABAB
于 2013-11-02T23:02:39.647 に答える