重复字符最长串(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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章