当前位置: 首页 > 知识库问答 >
问题:

缩短绳子

樊博雅
2023-03-14

我有一个字符串:

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个答案

璩华辉
2023-03-14

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

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)')
颜欣怡
2023-03-14

这就是我想出来的,代码很混乱,但我只是想快速地玩一玩,所以我就让它变成这样

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)

它使巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴=

当然,赛艇的答案是好几英里,甚至令人印象深刻

谭富
2023-03-14

您可以轻松地使用正则表达式执行此操作:

>>> 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函数将它们重写为表单(序列)号

 类似资料:
  • 我这里有一个JPanel,我想跟踪我给玩家的一些猜测。 每次调用PaintComponent时都会显示猜测。这是代码: 所发生的事情是,从先前调用repaint()来调用此方法的字符串不会消失。 这意味着“猜测剩余:”之后的数字在数字开始堆积之后变得不可读(从10开始,在调用方法之前下降一次)。 我看不出为什么这应该是一个问题。我遇到的一个类似问题是,当停止布尔值为真时,它应该退出该方法,而不是绘

  • Leetcode 题目描述 把一根绳子剪成多段,并且使得每段的长度乘积最大。 // html n = 2 return 1 (2 = 1 + 1) n = 10 return 36 (10 = 3 + 3 + 4) 解题思路 贪心 尽可能多剪长度为 3 的绳子,并且不允许有长度为 1 的绳子出现。如果出现了,就从已经切好长度为 3 的绳子中拿出一段与长度为 1 的绳子重新组合,把它们切成两段长

  • 我怎么才能解开绳子?输入是一个包含字母、数字和符号的形式的字符串,输出是一个包含重复子字符串的字符串。 示例:输入:2[qwe]4[qw]e输出:QWEQWEQWQWQWQWQWE 一个重复可能包含另一个重复。示例:2[3[q]w]=qqqwqqqw 不幸的是,我只能分成组件 =============================================================

  • 问题内容: 如何将mongodb ID缩短到更容易解析语法的URL中。该字符串在当前迭代中太长。 Base64不错,但仍然太长。我正在寻找7个以下字符范围内的更多内容。 我希望能够在node.js和浏览器中对其进行编码/解码。 问题答案: 从请求中解析ObjectId并不困难(因此我不确定为什么会出现问题?)。如果目标是创建可键入的URL,那么拥有更短且更“友好”的URL将很有价值。 您不能在分片

  • 以前,我使用下面的动态链接在我的应用程序中启动一个想要的页面 然而,这有一个缺点,对于没有安装我的应用程序的用户。对于没有安装我的应用程序的用户,这是当他点击链接时发生的情况 转到Google Play商店 安装应用程序。 启动应用程序。将转到应用程序的第一页,而不是在“深度链接”中指定的所需页面。 后来,我意识到Firebase动态链接可以解决我的问题。如果我使用下面的URL,一切正常。 对于第

  • Oracle Java社区网站上的一篇文章给出了以下方法作为示例(对于JPA转换器,但我想这与此无关): 将字符串y转换为字符串val有什么用?这样做有正当理由吗? 原创文章:JPA中的新功能