簡體   English   中英

如何在字符串中找到最長的重復相鄰值並在它們周圍加上括號

[英]How to find the longest repeated adjacent values in a string and put parentheses around them

我試圖遍歷一個字符串並圍繞最長的重復相鄰值標記 () 。 例子:

“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})'))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM