重复字符最长串(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)
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值