簡體   English   中英

試圖找到最長的統一 Substring

[英]Trying to find longest Uniform Substring

試圖找到最長的 Uniform Substring。

假設我有 abbbccda 那么我們必須得到“bbb”的索引 position 即。 [1, 3] 所以它應該返回 [1, 3]。 因為統一 Substring 從索引 1 開始,長度為 3 個字符。

其他示例:

"10000111" => [ 1, 4 ]

"aabbbbbCdAA" => [ 2, 5 ]

解決這個問題的 python 代碼是什么

我的代碼太長了。 忽略打印有這么多看output

x="aaaabbbbCdAA"
LIST1=[]
for char in x:
    if(char not in LIST1 ):
        LIST1.append(char)

print(LIST1)
list1=[]

for i in LIST1:
    list1.append(x.count(i))

print(list1)

Max_length_Charcater= max(list1)
print(Max_length_Charcater)

index_Max_length_Charcater=list1.index(Max_length_Charcater)
print(index_Max_length_Charcater)

y=LIST1[index_Max_length_Charcater]
print(y)

l=index_Max_length_Charcater
start_of_max_length_character=x.find(y)

for i in range(len(x)):
    if(x[i]==y):
        l+=1
print(l)

print("({0},{1})" .format(start_of_max_length_character,l))

您可以將列表推導與 zip 一起使用,以將字符與其前任匹配並識別連續條紋中斷的位置。 然后,從該位置列表中,您再次使用 zip 來獲取 position 范圍(從一個中斷到下一個中斷),您可以將其轉換為 (start,length) 元組列表。 長度最大的元組就是你想要的那個。

string = "aabbbbbCdAA"

breaks = [i for i,(a,b) in enumerate(zip(string,string[1:]),1) if a!=b]
ranges = [ (s,e-s) for s,e in zip([0]+breaks,breaks+[len(string)]) ]
print(max(ranges,key=lambda r:r[1]))

breaks列表將包含 [2, 7, 8, 9],它們是字母組的開始 position(隱含位置為零)。

ranges列表將通過組合每個組的開頭與下一組的開頭來形成(再次使用 zip)。 這允許計算每組的重復大小:[(0, 2), (2, 5), (7, 1), (8, 1), (9, 2)]

如果你膽子大,想深入研究正則表達式,re模塊提供了一種直接獲取重復字母子串的方法:

import re

string     = "aabbbbbCdAA"

streaks,_  = zip(*re.findall(r"((.)\2*)",string))
longest    = max(streaks,key=len)

print(string.index(longest),len(longest))
# 2 5

這是一個正則表達式解決方案:

import re 

strs=("10000111", "aabbbbbCdAA", "abbbccda")

for s in strs:
    uniq=set(s)
    mss=max([max(re.findall(f'{c}+', s), key=len) for c in uniq], key=len)
    print(f'{s}: {s.index(mss)}, {len(mss)}')

印刷:

10000111: 1, 4
aabbbbbCdAA: 2, 5
abbbccda: 1, 3

您也可以使用groupby來執行此操作:

from itertools import groupby 

for s in strs:
    mss=max([''.join(v) for k,v in groupby(s)], key=len)
    print(f'{s}: {s.index(mss)}, {len(mss)}')
# same output

暫無
暫無

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

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