算法題
題目:
給定一串字符,裏面有些字符有連續出現的特點,請尋找這些連續出現字符中最長的串,
如果最長的串有多個,請輸出字符ASCII碼最小的那一串。
例如:輸入aaabbbbbcccccccczzzzzzzz,輸出cccccccc。
思路:採用反向遍歷的思路
- 反向遍歷長度(len - len(set(arr)) + 1)
-
遍歷set(arr)
如果:當set(arr)遍歷完一遍之後出現 arr 能被 element*cur_len 分割開(splited_length > 1),
說明該重複串爲最長的重複串
(1) 如果set(arr)中不止一個同樣長度的最長重複串,則取ascii碼小的串
(2) dicts[lenght] = cur_element
(3) 將 flag 置爲 True -
判斷flag, False則繼續下一輪for循環;True則跳出外層循環
-
返回值=v*k
-
def maxRepeatStr(arr):
if not arr:
return arr
# 去重後的每個元素的重複字符串可能的最大長度
len_up_border = len(arr) - len(set(arr)) + 1
# 緩存遍歷,最大長度和當前元素(分別初始化爲1和最大ASCII碼對應的字符)
max_len = 1
cur_element = chr(127)
# res[max_len] = min_ascii_element_with_max_length
res = {}
# 長度反向遍歷的跳出標識
flag = False
for i in range(len_up_border, 0, -1):
for s in set(arr):
spt = s * i
# 以 spt 分割原始字符串作爲判斷依據:如果spt在arr中存在,則分割後長度>1; 若不存在,分割後長度=1
splited = arr.split(spt)
if len(splited) > 1:
# print('i-->', i, 's-->', s, 'splited-->', splited)
max_len = max(max_len, i)
cur_element = min(cur_element, s)
res[i] = cur_element
flag = True
if flag:
break
output = [v * k for k, v in res.items()]
return output[0]
測試結果:
arr = 'aaaaaaaaaaaaaasdffdiiiiiiiiiiiiii--------------558/**'
# print('--->', arr.split('aaaaaaaaaaaaaa'), len(arr.split('aaaaaaaaaaaaaa')))
res = maxRepeatStr(arr)
print(res)