如何找到字符串中重复时间最长的相邻值,并在它们周围加括号



我正在尝试遍历一个字符串,并在重复时间最长的相邻值周围标记((。示例:

"344556(7777(5412";

max_run = "0"    
J = "34455677775412"
for x in range(len(J)-1):
if J[x] == J[x+1]
if J[x:x+2] > max_run:
print( "(", end = "")
max_run = J[x:x+2]
print( ")", end = "")

标准库的包itertools中的方法groupby按顺序对项进行分组,然后取最大值。

import itertools as it
ref_string = "34455677775412"
max_squence = ''.join(max((list(j) for _, j in it.groupby(ref_string)), key=len))

print(ref_string.replace(max_squence, f'({max_squence})'))

程序主体的另一个实现(归功于Kelly Bundy(:首先将每组连接到一个字符串,然后通过最长字符串进行过滤

max_squence = max((''.join(j) for _, j in it.groupby(ref_string)), key=len)

喜欢itertools,但由于groupby已经有了一个(不错的(解决方案,这里有一个经典循环:

J = "34455677775412"
run = []
prev = None
for pos, char in enumerate(J):
if char == prev:
run[-1][0] += 1
else:
run.append([1, pos])
prev = char
print(run)
a,b = max(run, key=lambda x: x[0])
J[:b]+'('+J[b:b+a]+')'+J[b+a:]

输出:'344556(7777)5412'

如果您不能使用任何标准库方法,如groupby,这里有一个简单的python实现,它可以做同样的事情:

i = 0
max_start, max_end = 0, 0
J = "34455677775412"
# find the longest repeating sequence
while i < len(J):
j = i
while j < len(J) and J[j] == J[i]:
j += 1
max_start, max_end = max([(max_start, max_end), (i, j)], key=lambda e: e[1] - e[0])
i = j
print(max_start, max_end, J[max_start:max_end])
J = J[:max_start] + "(" + J[max_start:max_end] + ")" + J[max_end:]  # insert the parentheses
print(J)

您也可以使用Python正则表达式库re来实现与@cards的一个类似的解决方案

import re
J = "34455677775412"
pattern = r'(.)1+'
longest_sequence = max([match.group() for match in re.finditer(pattern, J)])
print(J.replace(longest_sequence, f'({longest_sequence})'))

最新更新