缩短字符串

时间:2017-06-09 08:45:17

标签: python algorithm python-3.x

我有一个字符串:

a = babababbaaaaababbbab

它需要缩短,所以看起来像这样:

(ba)3(b)2(a)5ba(b)3ab

所以基本上它需要占用所有重复的字符并写下它们重复的次数而不是打印它们。 我设法做了一半:

from itertools import groupby
a = 'babababbaaaaababbbab'
grouped = ["".join(grp) for patt,grp in groupby(a)]
solved = [str(len(i)) + i[0] for i in grouped if len(i) >= 2]

但这仅适用于重复但不是模式的字符。我明白,我可以通过找到' ab'字符串中的模式,但这对于每个可能的字符串都是可行的。有没有人遇到过类似的东西?

3 个答案:

答案 0 :(得分:10)

您可以使用regex轻松完成此操作:

>>> repl= lambda match:'({}){}'.format(match.group(1), len(match.group())//len(match.group(1)))
>>> re.sub(r'(.+?)\1+', repl, 'babababbaaaaababbbab')
'(ba)3(b)2(a)5ba(b)3ab'

这里解释不多。模式(.+?)\1+匹配重复的字符序列,lambda函数将它们重写为(sequence)number形式。

答案 1 :(得分:0)

这就是我提出的,代码很乱,但我只是想快点玩,所以我让它像这样

a = 'babababbaaaaababbbab'

def compress(text):
    for i in range(1, len(text) // 2):
        for j, c in enumerate(text[:-i if i > 0 else len(text)]):
            pattern = text[j:i+j]
            new_text = pattern_repeats_processor(pattern, text, j)
            if new_text != text:
                return compress(new_text)
    return text

def pattern_repeats_processor(pattern, text, i):
    chunk = pattern
    count = 1 
    while chunk == pattern and i + (count + 1) * len(pattern) < len(text):
        chunk = text[i + count * len(pattern): i + (count + 1) * len(pattern)] 
        if chunk == pattern:
            count = count + 1
        else:
            break
    if count > 1:
        return text[:i] + '(' + pattern + ')' + str(count) + text[i + (count + 0) * len(pattern):]
    return text

print(compress(a))
print(a)

它使 babababbaaaaababbbab =&gt; (BA)图3(b)图2(a)5BA(b)中3AB

P.S。当然,划船的答案更好,甚至相当令人印象深刻

答案 2 :(得分:-2)

我不确定你到底在寻找什么,但希望这会有所帮助。

A=a.count('a')
B=a.count('b')
AB=a.count('ab')
BAB=a.count('bab')
BA=a.count('ba')
print(A,'(a)',B,'(b)',AB,'(ab)',BAB,'(bab)',BA,'(ba)')