重複字符最長串(python版本)

算法題

題目:
給定一串字符,裏面有些字符有連續出現的特點,請尋找這些連續出現字符中最長的串,
如果最長的串有多個,請輸出字符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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章